0

我正在使用启用了代码优先和自动迁移的 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 个库存 <-> n 个房间
  • 1 个房间 <-> n 个项目
  • 1 个库存 <-> n 项

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

有什么提示吗?

4

1 回答 1

0

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

于 2014-04-17T10:05:14.967 回答