Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么导航属性集合总是空的_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# 为什么导航属性集合总是空的

C# 为什么导航属性集合总是空的,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,为什么下列程序中的导航属性程序集和组件始终为空 // 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 {

为什么下列程序中的导航属性程序集和组件始终为空

// 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();
}
//Item.cs
公共类项目
{
公共int ItemID{get;set;}
公共字符串Desc{get;set;}
公共虚拟ICollection程序集{get;set;}
公共虚拟ICollection组件{get;set;}
}
//物料清单
公共类物料清单
{
[键,列(顺序=0)]
public int AssemblyID{get;set;}
[键,列(顺序=1)]
公共int组件ID{get;set;}
公共整数数量{get;set;}
公共虚拟项程序集{get;set;}
公共虚拟项组件{get;set;}
}
//TestDbContext.cs
公共类TestDbContext:DbContext
{
公共TestDbContext()
:base(“name=Model1”)
{
SetInitializer(新的DropCreateDatabaseIfModelChanges());
}
公共虚拟数据库集项{get;set;}
公共虚拟数据库集BOMs{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasRequired(b=>b.Assembly)//BOM需要装配项
.WithMany(b=>b.Assembly)//项包括许多程序集(BOM)
.HasForeignKey(b=>b.AssemblyID)
.WillCascadeOnDelete(假);
modelBuilder.Entity()
.HasRequired(b=>b.Component)//BOM需要组件项
.WithMany(b=>b.Components)//项目包括许多组件(BOM)
.HasForeignKey(b=>b.ComponentID)
.WillCascadeOnDelete(假);
基于模型创建(modelBuilder);
}
}
//TestController.cs
公共字符串CreateBOM()
{
//创建项目
项目自行车=新项目();
bike.Desc=“bike”;
db.Items.Add(自行车);
项目框架=新项目();
frame.Desc=“frame”;
db.Items.Add(框架);
项目轮=新项目();
wheel.Desc=“车轮”;
db.项目.添加(车轮);
//创建BOM表
BOM表行1=新BOM表();
线路1.总成=自行车;
line1.组件=框架;
行1.数量=1;
db.BOMs.Add(第1行);
物料清单行2=新物料清单();
线路2.总成=自行车;
线路2.部件=车轮;
行2.数量=2;
db.BOMs.Add(第2行);
db.SaveChanges();
return“BOM已创建!”;
}
公共字符串ReadBOM()
{
Item bike=db.Items.Find(3);
//下一行始终返回0
return“Components:+bike.Components.Count.ToString();
}
CreateBOM方法工作得非常好,可以创建正确的记录,但是ReadBOM总是给出一个count=0!:(

试试这个

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

如果您的
ItemID
是由数据库自动生成的,那么您可以在创建
BOM
之前
SaveChanges()
,我认为您的代码工作得很好,问题是您从数据库中获得了一个
项目(
Bike
),该项目在创建
BOOM
实体实例时与
组件
无关

如果您尝试:

return "Assemblies: " + bike.Assemblies.Count.ToString();

您将得到预期的结果,因为bike与
Assembly

关联。在SaveChanges之后,您是否看到数据库中的Boom行?如果我没有错,我看到您只创建了两条记录,但尝试读取第四条记录:
DB.Items.Find(3);
?这会有问题吗?@octavioccl Yes BOM有以下行:AssemblyID组件ID数量3 4 1 3 62@SivaGopal3是Items表中程序集的ID。我肯定得到了正确的项目,因为在ReadBOM bike.Desc==“bike”这很奇怪,如果您没有禁用延迟加载,
组件
集合应该在访问时加载。调试您的代码并查看
Find
方法和check的结果类型是一个大名称。这是否代替或与:line1.Assembly=bike;line1.Component=frame;相同的结果:Count=0 t创建BOM表不是问题。问题在于读取BOM表。出于某种原因,EF没有填充ICollection导航属性。我认为这可能是因为表之间有两种关系,EF不知道该怎么做,但不幸的是,这是BOM表的正确设计。仅此而已!不是吗组件和组件导航属性是错误的!请问如何修复?在创建吊杆实例时设置自行车的
组件
导航属性没有意义。自行车不是车轮的组件。车轮是自行车的组件。自行车是车轮和车架的组件。我可以修复它吗使用Fluent API?我不认为这是一个可以用Fluent API解决的问题,这是您逻辑的一部分,如果您在某一点上将自行车保存为
组件
,那么当您访问
组件
导航属性时,您将获得相关的动臂实体,但在CreateBOM中,我有
line1.Assembly=bike;
而不是
line1.Component=bike;
。我真不明白为什么它认为bike是一个组件,而我清楚地说它是一个组件,车轮和车架是组件,而EF认为它们是组件!