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

C# 实体框架代码优先:一对多循环引用,c#,entity-framework,database-design,code-first,cyclic-reference,C#,Entity Framework,Database Design,Code First,Cyclic Reference,我使用的是EF6.1,启用了代码优先和自动迁移。到目前为止,我的模型(仅相关属性)如下所示: public class Inventory : IEntity { public virtual ICollection<Room> Rooms { get; set; } public virtual ICollection<Item> Items { get; set; } } public class Item : IEntity { publi

我使用的是EF6.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; }
}
公共类目录:IEntity{
公共虚拟ICollection房间{get;set;}
公共虚拟ICollection项{get;set;}
}
公共类项目:通用性{
public int RoomId{get;set;}
public int InventoryId{get;set;}
[外宾(“室友”)]
公共房间{get;set;}
[外键(“目录ID”)]
公共资源清册{get;set;}
}
公共教室:教室{
公共ICollection项{get;set;}
public int InventoryId{get;set;}
[外键(“目录ID”)]
公共资源清册{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);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity()
.has必需(房间=>room.Inventory)
.有许多(库存=>库存房间)
.HasForeignKey(room=>room.InventoryId);
modelBuilder.Entity()
.has必需(项=>项.Room)
.WithMany(房间=>room.Items)
.HasForeignKey(item=>item.RoomId);
modelBuilder.Entity()
.HasRequired(项=>项.库存)
.带有多个(库存=>库存项目)
.HasForeignKey(item=>item.InventoryId);
}
就建模而言,我期望的是:

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


有什么提示吗?

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

我的模型曾经工作过,我唯一更改的是添加房间实体。我看到有某种循环,但库存总是在每个参考的一侧。就我所想,应该有一个从库存->房间->物品的分级参考来进行过滤。另外,我能看到的唯一一件事是可能存在不一致(Item.Room.Inventory!=Item.Inventory),但这不应该是模型创建的设计问题,对吗?我不知道,我不是一个真正的程序员(仍在学习),但有一件事我确实知道,那就是,如果有可能,那就是它,那么可能就是它