EF代码优先 - 具有2个或更多相同类型的子关系的表

时间:2018-01-18 13:20:35

标签: c# sql entity-framework

这已被问过几次,但到目前为止我看到的解决方案还没有解决问题。

我有这样的表格。

public class TableA
{
   public int Id {get;set;}

   public int TableBRefAId {get; set;}

   public int TableBRefBId {get; set;}

   [Required]
   public TableB ItemA {get;set;}

   [Required]
   public TableB ItemB {get;set;}
}

public class TableB
{
    public int Id {get;set;}

    public virtual IList<TableA> TableAList { get; set; }
}

然后在DataContext中我有了这个。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<TableA>()
            .HasRequired<TableB>(p => p.ItemA)
            .WithMany(pp => pp.TableAList )
            //.HasForeignKey(x => x.TableBRefAId)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<TableA>()
            .HasRequired<TableB>(p => p.ItemB)
            .WithMany(pp => pp.TableAList )
            //.HasForeignKey(x => x.TableBRefBId)
            .WillCascadeOnDelete(false);
    }

当我尝试运行“Add-Migration AddedTableA”时,我收到以下错误。

  

指定的架构无效。错误:未加载“TableA_ItemA”关系,因为“TableB”类型不可用。

我需要它的方式来表明TableA有2个必需的TableB属性。

如果删除TableA,TableB不受影响。

如果删除TableB,TableA

也是如此

2 个答案:

答案 0 :(得分:5)

您应该为TableB实体指定两个集合来表示两个引用;

public class TableB
{
    public int Id { get; set; }

    public virtual IList<TableA> TableItemAList { get; set; }

    public virtual IList<TableA> TableItemBList { get; set; }
}

然后;

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<TableA>()
        .HasRequired<TableB>(p => p.ItemA)
        .WithMany(pp => pp.TableItemAList)
        //.HasForeignKey(x => x.TableBRefAId)
        .WillCascadeOnDelete(false);

    modelBuilder.Entity<TableA>()
        .HasRequired<TableB>(p => p.ItemB)
        .WithMany(pp => pp.TableItemBList)
        //.HasForeignKey(x => x.TableBRefBId)
        .WillCascadeOnDelete(false);
}

答案 1 :(得分:0)

首先尝试将ClassA中的ItemA和ItemB设为虚拟 并在TableB类中添加另一个TableA虚拟列表