1

我在这里通过代码优先方法创建了一个基于 EntityFramework 的数据库。该数据库包含两个表,它们之间存在父子关系:

  1. Orderlists(基于模型“订单列表”
  2. Orders(基于模型“订单”

其中 Orderlists 包含ICollection<Order> Orders应该 (!) 列出所有相关订单。由于某种原因,它没有。

控制器的 DbContext 包含两个 DbSet:

  1. DbSet<Orderlist>
  2. DbSet<Order>

另一方面,模型Order有两个属性(其类型在括号中):

  1. int OrderlistId
  2. Orderlist OrderList

在控制器中的 [HttpPost] Create方法的新Order对象中,我通过从 DbContext 中选择适当的Orderlist对象(具有正确提供/选择的 ID),设置新创建的Order的OrderlistIdOrderlist来连接此关系适当的对象并将Order添加到所选择的Orderlist的Orders集合中(如果它为 null,则创建集合)。

然后我做了一个db.SaveChages();它应该做的事情。

当首先从模型的代码生成数据库时,关于关系,只有OrderlistId属性会在数据表中生成一个字段。OrderlistOrders集合和Order的Orderlist属性都不会在表中生成字段。没关系,因为它仍然是一个有效的关系:Orderlist的 ID是一个 PK,并且OrderlistId值设置正确。数据表的方案也反映了外键的关系。

现在,问题是在我的应用程序的不同点处理数据时,关系没有恢复。当我从 DbContext 中选择Orders ICollection时,它始终为 空。

我的问题是:创建对象时是否应该自动填写订单 ?或者我是否必须通过迭代订单来手动填写它并将每个适当的订单手动添加到其相关的订单列表中?而且,如果我必须这样做,我必须在哪里以及如何做到这一点?ICollectionDbContextDbSetDbContext

4

1 回答 1

1

Entity Framework Code First 模型中的所有关联属性都必须用virtual关键字标记,如果您希望 Entity Framework 按需自动加载关联实体(延迟加载)。

以下(基本)模型定义应该有效。

public class OrderList
{
    public int OrderListId { get; set; }

    public virtual ICollection<Order> Orders { get; set; } // note the use of virtual
}

public class Order
{
    public int OrderId { get; set; }

    public int OrderListId { get; set; }
    public virtual OrderList OrderList { get; set; } // note the use of virtual
}

另外,请注意,将订单添加到订单列表时,您不必在订单实体上设置关联属性。您可以简单地将新订单添加到 OrderList 实体上的 Orders 集合中,如下所示:

int orderListId = 1;
OrderList orderList = context.OrderLists.Find(orderListId);

Order newOrder = new Order();
orderList.Orders.Add(newOrder);
context.SaveChanges();

或者,您可以只在新订单上设置 OrderListId 属性,并将其添加到 DbContext Orders 集合中。

Order order = new Order();
order.OrderListId = 1;
context.Orders.Add(order);
context.SaveChanges();
于 2012-09-23T15:20:21.133 回答