Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.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# EF 5编码第一个一对多导航属性Null,直到刷新上下文_C#_Entity Framework_Code First_Dbcontext_Navigation Properties - Fatal编程技术网

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 :)
}