首先在Entity Framework代码中链接子表

新西兰詹姆斯

很简单的情况,但是周围有很多EF示例的排列,很难找到您需要的确切示例。我有一个包含主要用户信息的用户表,但是我想要子表以获取相关信息,例如一个子表用于用户配置文件,一个用于用户搜索条件,一个用于其位置。例如,我有以下表格

用户UserProfile UserSearchCriteria

我希望用户对象包含其他对象并在检索User对象时检索它们,因此从代码中我可以说例如User.Profile.MainText或User.Location.Postcode。User表应生成主UserId键,并且该键应该是用于UserProfile,UserSearch的键。

因此,在插入包含嵌套用户配置文件和用户搜索对象的用户对象之后,我应该在用户表中有一个带有新标识插入用户名的条目,并且在其他两个表中也应分别有一行,并插入与用户名相同的主键。

到目前为止,我的代码可以执行此操作,但是唯一不希望发生的事情是我在User表上获得了其他列,并为每个外键关联重复了UserId。我将为User类和其中一个嵌套类粘贴我的类代码,以便您理解

[Table("User")]
    public class DbUser
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }

        [Required]
        [MaxLength(80)]
        public string FirstName { get; set; }

        [Required]
        [MaxLength(80)]
        public string LastName { get; set; }

        [Required]
        [MaxLength(80)]
        public string EmailAddress { get; set; }

        [Required]
        public DateTime DateOfBirth { get; set; }

        [Required]
        [MaxLength(1)]
        public string Gender { get; set; }

        [Required]
        public virtual DbGeographicalArea Location { get; set; }

        [Required]
        [MaxLength(80)]
        public string Profession { get; set; }

        [Required]
        public DateTime DateJoined { get; set; }

        [Required]
        public DateTime LastLoggedOn { get; set; }

        [Required]
        [MaxLength(1)]
        public string Status { get; set; }

        [MaxLength(500)]
        public string StatusNotes { get; set; }

        public virtual DbUserMatchCriteria UserMatchCriteria { get; set; }

        public virtual DbUserMatchLifestyle UserMatchLifestyle { get; set; }

        public virtual DbUserProfile Profile { get; set; }

        public virtual DbUserPassword Password { get; set; }

        public virtual ICollection<DbUserPhoto> Photos { get; set; }
    }

[Table("UserMatchCriteria")]
    public class DbUserMatchCriteria
    {
        [Key]
        public int UserId { get; set; }


    }
}

当我首先使用EF代码保存对象并且UserMatchCriteria表创建良好时,User表具有所有必需的列,但是唯一的问题是在User表列的末尾,我还有一个多余的列,称为UserMatchCriteria_UserId,该列仅包含与主UserId相同的ID,因此,当我只想要单向关联时,这两个表之间就存在一种双向关联。

我的方法或想法是否错误?我想如果数据库完全对代码进行建模,那么您应该像代码中那样包含此列,则User对象知道UserMatchCriteria对象,但是根据我的关系数据库历史,在SQL中让那些不必要的重复列出现对我来说是错误的在最后。

索拉克斯

这是具有1-1实体关系的Code-First的本机行为。ORM的使用意在抽象这些实现细节。

此外,您可能要考虑删除Key注释DbUserMatchCriteria,使注释成为复杂类型并内联。

更新:需要权衡的是,您最终可能会获得相当宽的行。这可能会导致其他分页。但是,两个表需要联接或可能需要另一次访问数据库。但是相对于诸如网络延迟之类的东西,这些差异可能是微不足道的。

因此,像所有性能问题一样,它取决于许多因素,真正了解的唯一方法是进行测量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何首先在Entity Framework代码中为Identity主键设置起始值?

首先在同一张表中启用Entity Framework 5代码中的多对多

首先在哪里可以找到Entity Framework 4.0代码中的.csdl,.ssdl和.msl文件?

如何首先在Entity Framework Core 2.0代码中按类型继承创建Table?

如何首先在Entity Framework代码中创建2个具有相同类型的dbset?

首先在EF代码中删除列

如何首先在ASP.NET MVC中将Identity与Entity Framework数据库一起使用

如何首先在代码中保存外键的集合

首先在mysqli中显示较新的数据

首先在设备上的iOS 9中与NSURLConnection连接

如何首先在Wicket中呈现<meta>标签?

首先在路由表中插入忽略的路由

首先在javascript中显示已加载的元素

替换所有捕获的组,但首先在 sed 中

首先在子级子级中添加儿童

哪个文件首先在pytest中执行?

首先在nodejs winston logger中编写时间戳

如何从首先在php中重新启动循环

哪个函数将首先在angularjs指令中执行?链接还是控制器?

首先在实体框架代码中初始化数据库中的对象

首先在实体框架代码中为同一表定义多个外键

首先在EF6代码中创建多对多关系

之后首先在Firebase云功能中执行代码

EF例外,如何首先在C#和实体框架代码中为地址建模

如何首先在实体框架代码中的 linq 中使用可为空列表?

如何首先在EF6代码中设置唯一属性

首先在模型存储库MVC 4代码中验证会话变量

如何首先在asp.net核心中的代码中创建关系

首先在EF代码中设计一对多关系的最佳实践