实体框架代码优先:一对多循环引用

时间:2014-04-17 09:45:19

标签: c# entity-framework database-design code-first cyclic-reference

我正在使用EF 6.1,首先启用代码并启用自动迁移。到目前为止,我的模型(仅限相关属性)如下所示:

public class Inventory : IEntity {
    public virtual ICollection<Room> Rooms { get; set; }
    public virtual ICollection<Item> Items { get; set; }
}

public class Item : IEntity {
    public int RoomId { get; set; }
    public int InventoryId { get; set; }

    [ForeignKey("RoomId")]
    public Room Room { get; set; }

    [ForeignKey("InventoryId")]
    public Inventory Inventory { get; set; }
}

public class Room : IEntity {
    public ICollection<Item> Items { get; set; }
    public int InventoryId { get; set; }

    [ForeignKey("InventoryId")]
    public Inventory Inventory { get; set; }
}

在我的DbContext中,我通过以下方式创建引用:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Room>()
                .HasRequired<Inventory>(room => room.Inventory)
                .WithMany(inv => inv.Rooms)
                .HasForeignKey(room => room.InventoryId);

    modelBuilder.Entity<Item>()
                .HasRequired<Room>(item => item.Room)
                .WithMany(room => room.Items)
                .HasForeignKey(item => item.RoomId);

    modelBuilder.Entity<Item>()
                .HasRequired<Inventory>(item => item.Inventory)
                .WithMany(inv => inv.Items)
                .HasForeignKey(item => item.InventoryId);
}

在建模方面,我期望得到的是:

  • 1个库存&lt; - &gt; n个房间
  • 1个房间&lt; - &gt; n项
  • 1个库存&lt; - &gt; n项

因此,我希望能够通过库存直接或按房间过滤项目。运行应用程序并首次访问DbContext时,抛出SqlCeException,告诉我有循环引用。现在,由于库存在所有情况下都是主实体,并且只有另一个细节步骤(房间) - 可以跳过进行过滤 - 我在图表中看不到任何循环。

任何提示?

1 个答案:

答案 0 :(得分:0)

您是否有可能拥有两个具有不同要求的项目实体项目。 mayb与它有关,你确定错误与你的图形有关,而不是代码中的其他地方。