1

我已经看到这个问题问了几次,但没有解决我的问题。我已经创建了最简单的版本:

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; }
}

一个订单可以有很多项目。简单的。现在与 EF 交互:

using (var context = new TestContext())
{
    Order test = new Order();
    context.Orders.Add(test);
    context.SaveChanges();
    test.Items.Add(new Item {Description = "test"});  // no good - test.Items is null!
}

如果我这样做,这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 :)
}

我错过了什么?或者每次我添加一个具有一对多导航属性的项目时,我真的需要获得一个新的上下文吗?

预先感谢,哦,聪明的以太大师,他知道这个问题的真相!

4

1 回答 1

3

您需要DbSet.Create()在使用代理实体时创建实体(默认设置)。

Entity Framework Code First 将在运行时创建从模型类继承的新类。因此,您不是在使用您的Order类,而是使用从它继承的类。这个新实现将覆盖您的虚拟导航属性以实现附加功能(例如延迟加载)。

您在此处需要的特定功能是注意集合何时更改。您的类不提供任何这样的功能(也不应该),但代理类提供。

现在,当new Class()您使用模型对象时,它将完全是您的对象。它不会是代理实体,因此不会具有附加功能。DbSet.Create()另一方面,将返回代理实体,向上转换到您的类,因此您正在使用代理。

于 2013-04-27T12:13:53.310 回答