相当简单的场景,但围绕它的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中有这些不必要的重复列是错误的最后。
答案 0 :(得分:0)
这是Code-First的本机行为,具有1-1实体关系。使用ORM意味着抽象出这些实现细节。
此外,您可能需要考虑从Key
删除DbUserMatchCriteria
注释,这将使其成为Complex Type并内联。
更新:权衡是你可能会得到相当宽的行。这可能会导致额外的分页。但是两个表需要连接或可能另一个数据库之旅。但是,相对于网络延迟等问题,这些差异可能微不足道。
因此,与所有性能问题一样,它取决于很多因素,而真正了解的唯一方法就是衡量。