在Entity Framework中使用一对多双向关系时是否存在性能影响?

时间:2015-07-21 20:32:50

标签: linq entity-framework

我们一直在EF中实施ERD。

enter image description here

项目代码优先

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的东西?

1 个答案:

答案 0 :(得分:1)

看起来不错。有一些怪癖,比如为什么要为项目分配ID和GUID。真的应该是一个或另一个。

Single似乎不合适,因为您正在选择UserAttributes,它可能是其中的一个或多个。单一意味着只有一个,如果这是真的,那么你的设计应该比它应该更复杂。

我假设您将为字符串和整数添加导航属性,这很好。

User*Attributes类也应该具有UserAttributes的导航属性。

我试过分析你的设计,我只能说它让我头疼。我会假设有一些外部原因你选择了PK而不是使用自然键。从一目了然,UserAttributes看起来名字很差。它不是用户属性,它似乎是项目的属性(或可为每个项目分配给用户的属性)。我还会问,如果将属性分解为3个单独的表而不是总是将值序列化为字符串值得头疼,因为它不太可能为您节省任何空间(除了整数 - 也许)并且大大减慢你需要做的每一个查询。