很简单的情况,但是周围有很多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] 删除。
我来说两句