我如何建立这种EF关系?

时间:2014-06-23 12:48:42

标签: c# entity-framework asp.net-mvc-4 ef-code-first

我可以在数据库中执行此操作,但我想了解如何执行此代码优先。

我有这堂课:

public class Component
{
    public Guid ID { get; set; }
    public Guid Name { get; set; }

    public virtual Component Master { get; set; }
    public virtual ICollection<Component> Components { get; set; }
}

组件可以包含许多子组件。 组件也可以是许多其他组件中的子组件。

我想创建一个将Component的ID关联在一起的表。代表这个的最佳方式是什么?

1 个答案:

答案 0 :(得分:2)

当你有一个像这样的自引用实体时,只能有一个父代:

public class Component
{
    public Guid ID { get; set; }
    public Guid Name { get; set; }

    public virtual Component Master { get; set; }
    public virtual ICollection<Component> Components { get; set; }

    // reference to the parent guid (if any)
    public Guid? MasterID { get; set; }
}

要配置实体关系,请在OnModelCreating:

中执行此操作
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Component>()
        .HasMany(c => c.Components)
        .WithOptional(c => c.Master)
        .HasForeignKey(fk => fk.MasterID);
}

另一种选择是设置外部参照/连接表,而不是将其作为组件表上的列,但在这种情况下,您有多对多的关系,因此您只有一个组件母版,而不是单个组件母版。组件作为主人。您可以使用唯一键将其强制为只使用单个父级,但您仍需要从EF的角度将其建模为集合。

以下是使用外部参照表的示例:

public class Component
{
    public Guid ID { get; set; }
    public Guid Name { get; set; }

    public virtual ICollection<Component> Masters { get; set; }
    public virtual ICollection<Component> Components { get; set; }       
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Component>()
        .HasMany(c => c.Components)
        .WithMany(c => c.Masters)
        .Map(xref => xref.MapLeftKey("ParentID").MapRightKey("ChildID").ToTable("ComponentXref"));
}