Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我如何建立这种EF关系?_C#_Entity Framework_Asp.net Mvc 4_Ef Code First - Fatal编程技术网

C# 我如何建立这种EF关系?

C# 我如何建立这种EF关系?,c#,entity-framework,asp.net-mvc-4,ef-code-first,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;

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

我有这门课:

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; }
}
公共类组件
{
公共Guid ID{get;set;}
公共Guid名称{get;set;}
公共虚拟组件主机{get;set;}
公共虚拟ICollection组件{get;set;}
}
一个组件可以有多个子组件。 组件也可以是许多其他组件中的子组件


我想创建一个将组件ID关联在一起的表。最好的表示方法是什么?

当您有一个这样的自引用实体,它只能有一个父实体时:

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; }
}
公共类组件
{
公共Guid ID{get;set;}
公共Guid名称{get;set;}
公共虚拟组件主机{get;set;}
公共虚拟ICollection组件{get;set;}
//对父guid的引用(如果有)
公共Guid?主ID{get;set;}
}
要配置实体关系,请在OnModelCreating中执行以下操作:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Component>()
        .HasMany(c => c.Components)
        .WithOptional(c => c.Master)
        .HasForeignKey(fk => fk.MasterID);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasMany(c=>c.Components)
.with可选(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"));
}
公共类组件
{
公共Guid ID{get;set;}
公共Guid名称{get;set;}
公共虚拟ICollection主机{get;set;}
公共虚拟ICollection组件{get;set;}
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasMany(c=>c.Components)
.有许多(c=>c.Masters)
.Map(xref=>xref.MapLeftKey(“ParentID”).mapreghtkey(“ChildID”).ToTable(“ComponentXref”);
}

创建将ID关联在一起的表是什么意思?为什么不为父组件使用带有FK的表?这不起作用,因为一个组件可以有多个父组件(主组件)。我的意思是一个交叉参考表,比如在Dismissle的回答中。那么,也许你需要收集大师?否则,您想选择哪一个作为主组件?是的,我在加载子组件时只需要一个主组件,但现在我明白了我需要做什么才能让EF理解我想要的数据结构。Dismissle的答案是正确的。这创建了我希望在数据库中看到的内容,但没有保存到数据库中?只有ID从UI传回,我正在创建一个新组件,设置它的ID,将父组件添加到Masters,并将子组件添加到Masters子集合。数据库中没有显示任何内容-是否缺少某些内容?@Cari我必须查看您的代码才能理解您的意思。不过,我认为当我需要编写更多代码时,事情会神奇地发生。