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

本文关键字:一对多 循环 引用 框架 代码 实体 | 更新日期: 2023-09-27 17:58:48

我使用的是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在所有情况下都是主实体,并且只有另一个细节步骤(房间)——可以跳过它进行筛选——所以我在图中没有看到任何循环。

有什么提示吗?

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

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