【问题标题】:EF code first - Table with 2 or more child relationships of the same typeEF 代码优先 - 具有 2 个或多个相同类型的子关系的表
【发布时间】:2018-01-18 13:20:34
【问题描述】:

这个问题已经问了好几次了,但是我目前看到的解决方案都没有解决这个问题。

我有这样的桌子。

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 具有 TableB 的 2 个必需属性。

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

如果 TableB 被删除,TableA 也被删除

【问题讨论】:

  • 2 个引用需要 2 个集合。

标签: c# sql entity-framework


【解决方案1】:

您应该为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);
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 据我了解,规则是:如果您不想延迟加载某些属性,请不要使用 virtual。可能是 OP 不想延迟加载 ItemAItemB
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多