我们一直在EF中实施ERD。
项目代码优先
public class Project
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ProjectID { get; set; }
[Index("IX_ProjectGUID", IsUnique = true)]
[Required]
public Guid GUID { get; set; }
[MaxLength(256), Index("IX_ProjectName", IsUnique = true)]
[Required]
public string Name { get; set; }
public virtual ICollection<UserAttribute> UserAttributes { get; set; }
}
UserAttributes的代码优先
public class UserAttribute
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserAttributeID { get; set; }
[Index("IX_Project_Atttribute_Name", 1, IsUnique = true)]
public int ProjectID { get; set; }
[ForeignKey("ProjectID")]
public virtual Project Project{ get; set; }
[Index("IX_Project_Atttribute_Name", 2, IsUnique = true)]
public int AttributeTypeID { get; set; }
[ForeignKey("AttributeTypeID")]
public virtual SystemUserAttribute SystemUserAttribute { get; set; }
[MaxLength(256), Index("IX_Project_Atttribute_Name", 3, IsUnique = true)]
[Required]
public string Name { get; set; }
public virtual ICollection<UserBooleanAttribute> UserBooleanAttributes { get; set; }
}
因此,您可以从每个类的最后一行看到设置了1-many双向关系。
在我介绍这个1-many系列之前,我会被要求todo:
var jar = context.Projects
.Where(p=>p.ProjectID==1)
.Join(
context.UserAttributes,
a => a.ProjectID, b => b.ProjectID,
(a, b) => new {a, b});
现在我只需做:
Projects.Where(prj=>prj.ProjectID==1).Select(ua=>ua.UserAttributes).Single()
由于Lazy-Loading有效,是否真的没有性能下降?
* Single - 为什么我需要调用此类或类似FirstOrDefault的东西?
答案 0 :(得分:1)
看起来不错。有一些怪癖,比如为什么要为项目分配ID和GUID。真的应该是一个或另一个。
Single似乎不合适,因为您正在选择UserAttributes,它可能是其中的一个或多个。单一意味着只有一个,如果这是真的,那么你的设计应该比它应该更复杂。
我假设您将为字符串和整数添加导航属性,这很好。
User*Attributes
类也应该具有UserAttributes的导航属性。
我试过分析你的设计,我只能说它让我头疼。我会假设有一些外部原因你选择了PK而不是使用自然键。从一目了然,UserAttributes看起来名字很差。它不是用户属性,它似乎是项目的属性(或可为每个项目分配给用户的属性)。我还会问,如果将属性分解为3个单独的表而不是总是将值序列化为字符串值得头疼,因为它不太可能为您节省任何空间(除了整数 - 也许)并且大大减慢你需要做的每一个查询。