C# EF 5编码第一个一对多导航属性Null,直到刷新上下文
这个问题我已经问过好几次了,但都没有解决我的问题。我已经创建了最简单的版本:C# EF 5编码第一个一对多导航属性Null,直到刷新上下文,c#,entity-framework,code-first,dbcontext,navigation-properties,C#,Entity Framework,Code First,Dbcontext,Navigation Properties,这个问题我已经问过好几次了,但都没有解决我的问题。我已经创建了最简单的版本: public class Order { public int OrderId { get; set; } public virtual List<Item> Items { get; set; } //One to many navigation property } public class Item { public int ItemId { get; set; }
public class Order
{
public int OrderId { get; set; }
public virtual List<Item> Items { get; set; } //One to many navigation property
}
public class Item
{
public int ItemId { get; set; }
public string Description { get; set; }
}
如果我这样做test.Items
将为空,我无法与之交互。但是,如果我“刷新”上下文,则一切正常:
using (var context = new TestContext())
{
context.Orders.Add(new Order());
context.SaveChanges();
}
using (var context = new TestContext())
{
Order test = context.Orders.First();
test.Items.Add(new Item {Description = "test"}); // Happy days - test.Items is NOT null :)
}
我错过了什么?或者每次添加具有一对多导航属性的项时,我真的需要获得一个新的上下文吗
提前感谢,哦,智慧的以太大师,知道这个主题的真相 使用代理实体时,需要使用
DbSet.create()
创建实体(默认设置)
实体框架代码首先将在运行时创建从模型类继承的新类。因此,您使用的不是Order
类,而是继承自它的类。这个新的实现将覆盖虚拟导航属性以实现其他功能(例如延迟加载)
这里您需要的特定功能是在集合发生更改时注意。您的类不提供任何类似的功能(也不应该提供),但代理类提供
现在,当您
newclass()
您的模型对象时,它正是您的对象。它不会是代理实体,因此不会有额外的特性<另一方面,code>DbSet.Create()将返回代理实体,并向上转换到您的类中,因此您正在使用代理。是否使用代理类?如果是,请不要使用“新建”自己创建对象。改为使用dbSet.Create()。这将创建一个代理实例而不是您的类。这不是完整的修复方法,但您应该将虚拟列表项
更改为IList
-虚拟IList项
将类型更改为ICollectionIList,ICollection并不能解决问题,但我以前见过有人这样说-为什么要使用它们?列表不好吗?使用context.Orders.Create()确实解决了这个问题-但我不完全理解为什么(或者更重要的是,我不理解为什么只使用“新顺序”就可以解决所有问题,除了一对多关系)。感谢所有人的回复,任何进一步的解释也会受到欢迎:)
using (var context = new TestContext())
{
context.Orders.Add(new Order());
context.SaveChanges();
}
using (var context = new TestContext())
{
Order test = context.Orders.First();
test.Items.Add(new Item {Description = "test"}); // Happy days - test.Items is NOT null :)
}