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

时间:2014-01-10 16:20:26

标签: c# entity-framework

相当简单的场景,但围绕它的EF示例的排列很多,很难找到你需要的确切的一个。我有一个User表,其中包含主要用户信息,但后来我想要相关信息的子表,例如一个用户配置文件,一个用户搜索条件,一个用于他们的位置。例如,我有以下表格

用户 用户资料 UserSearchCriteria

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

因此在插入包含嵌套的userprofile和usersearch对象的用户对象之后,我应该在User表中有一个带有新标识插入UserId的条目,并且在其他两个表中也有一行,并且插入了相同的主键。 UserId。

到目前为止,我的代码实现了这一点,但唯一不可取的是我在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; }


    }
}

User表具有在我首先使用EF代码保存对象时生成的所有必需列,并且UserMatchCriteria表创建正常,但唯一的问题是在User表列的末尾,我有一个额外的不需要的列名为UserMatchCriteria_UserId它只包含与主UserId相同的ID,因此当我只想要单向关联时,这两个表之间存在双向关联。

我的方法或想法是错的吗?我想如果数据库确切地为代码建模,那么你应该在代码中有这个列,User对象知道UserMatchCriteria对象,但是对于我的关系数据库的历史,我觉得在SQL中有这些不必要的重复列是错误的最后。

1 个答案:

答案 0 :(得分:0)

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

此外,您可能需要考虑从Key删除DbUserMatchCriteria注释,这将使其成为Complex Type并内联。

更新:权衡是你可能会得到相当宽的行。这可能会导致额外的分页。但是两个表需要连接或可能另一个数据库之旅。但是,相对于网络延迟等问题,这些差异可能微不足道。

因此,与所有性能问题一样,它取决于很多因素,而真正了解的唯一方法就是衡量。