为什么导航属性集合始终为空

时间:2016-11-02 14:49:21

标签: c# asp.net-mvc entity-framework

为什么导航属性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! :(

2 个答案:

答案 0 :(得分:1)

我认为您的代码运行良好,问题是当您创建{{1}时,您的数据库ItemBike)与Component无关。实体实例。

如果您尝试:

BOOM

您将获得预期的结果,因为自行车仅与return "Assemblies: " + bike.Assemblies.Count.ToString();

相关

答案 1 :(得分:0)

试试这个

line1.AssemblyID = bike.ItemID;
line1.ComponentID = frame.ItemID;  

如果您的ItemID由数据库自动生成,则可以在创建SaveChanges()之前BOM