为什么导航属性Assemblies and Components在以下程序中始终为空?
// Item.cs
public class Item
{
public int ItemID { get; set; }
public string Desc { get; set; }
public virtual ICollection<BOM> Assemblies { get; set; }
public virtual ICollection<BOM> Components { get; set; }
}
// BOM.cs
public class BOM
{
[Key, Column(Order = 0)]
public int AssemblyID { get; set; }
[Key, Column(Order = 1)]
public int ComponentID { get; set; }
public int Qty { get; set; }
public virtual Item Assembly { get; set; }
public virtual Item Component { get; set; }
}
// TestDbContext.cs
public class TestDbContext : DbContext
{
public TestDbContext()
: base("name=Model1")
{
Database.SetInitializer<TestDbContext>(new DropCreateDatabaseIfModelChanges<TestDbContext>());
}
public virtual DbSet<Item> Items { get; set; }
public virtual DbSet<BOM> BOMs { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<BOM>()
.HasRequired<Item>(b => b.Assembly) // BOM requires Assembly Item
.WithMany(b => b.Assemblies) // Item includes many Assemblies (BOMs)
.HasForeignKey(b => b.AssemblyID)
.WillCascadeOnDelete(false);
modelBuilder.Entity<BOM>()
.HasRequired<Item>(b => b.Component) // BOM requires Component Item
.WithMany(b => b.Components) // Item include many Components (BOMs)
.HasForeignKey(b => b.ComponentID)
.WillCascadeOnDelete(false);
base.OnModelCreating(modelBuilder);
}
}
// TestController.cs
public string CreateBOM()
{
// Create the items
Item bike = new Item();
bike.Desc = "Bike";
db.Items.Add(bike);
Item frame = new Item();
frame.Desc = "Frame";
db.Items.Add(frame);
Item wheel = new Item();
wheel.Desc = "Wheel";
db.Items.Add(wheel);
// Create the Bill Of Materials
BOM line1 = new BOM();
line1.Assembly = bike;
line1.Component = frame;
line1.Qty = 1;
db.BOMs.Add(line1);
BOM line2 = new BOM();
line2.Assembly = bike;
line2.Component = wheel;
line2.Qty = 2;
db.BOMs.Add(line2);
db.SaveChanges();
return "BOM has been created!";
}
public string ReadBOM()
{
Item bike = db.Items.Find(3);
// The following line always returns 0
return "Components: " + bike.Components.Count.ToString();
}
CreateBOM方法工作正常并创建正确的记录,但ReadBOM始终给出count = 0! :(
答案 0 :(得分:1)
我认为您的代码运行良好,问题是当您创建{{1}时,您的数据库Item
(Bike
)与Component
无关。实体实例。
如果您尝试:
BOOM
您将获得预期的结果,因为自行车仅与return "Assemblies: " + bike.Assemblies.Count.ToString();
答案 1 :(得分:0)
试试这个
line1.AssemblyID = bike.ItemID;
line1.ComponentID = frame.ItemID;
如果您的ItemID
由数据库自动生成,则可以在创建SaveChanges()
之前BOM
。