我正在使用启用了代码优先和自动迁移的 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 在所有情况下都是主实体,并且只有另一个详细步骤(房间)——可以跳过过滤——所以我在图表中看不到任何循环。
有什么提示吗?