1

我正在使用 EF5,POCO 数据库优先方法。假设我需要创建一个新客户和一个新订单:-

var customer = new Customer();
var order = new Order();

order.Customer = customer;
order.CustomerId = customer.Id;

customer.Orders.Add(order);

我真的必须包括最后三行来建立关系吗?这里要指出的是,我正在内存中创建实体层次结构,并可能长时间操纵它,直到用户点击“保存”。

让我困惑的是创建几个新客户对象的想法。每个最终都会以 0 的 ID 结束(在被持久化之前)。在我的代码中有很多地方我使用 Order 的 CustomerId 属性来做一些事情。如果有几个新客户(ID 0),那么我如何获得正确的客户?或者我应该总是使用Order.Customer并且从不使用Order.CustomerId(在这种情况下,摆脱上面代码中的 ID 分配是否安全)?

4

1 回答 1

1

当您添加新客户时,将插入整个图表并正确设置关系。您不需要手动设置关系(请参阅添加一对多实体):

var customer = new Customer();
customer.Orders.Add(new Order());
context.Customers.Add(customer);
context.SaveChanges();

当您调用Customers.Add客户实体时,将添加到上下文并放入Added状态。所有相关实体(订单)都会发生同样的情况 - 它们将具有Added状态。所有图表将在SaveChanges调用时插入数据库。

请记住,此技巧不适用于更新图形。

顺便说一句:有一篇很好的 MSDN 文章定义和管理关系值得一读。


更新:使用 EF 时会发生以下情况:

var customer = new Customer();
var order = new Order();
customer.Orders.Add(order); // order.Customer is null

此时EF完全没有参与。您可以手动设置订单对象的客户。通常我在AddorRemove方法中管理两种方式的关联。即添加订单到订单集合,并将所有者设置为this. 此时由您决定。默认情况下,订单所有者将为null. 下一个:

context.Customers.Add(customer); // order.Customer is customer, but no ids

EF来了。没有任何东西被持久化到数据库中。但是EF 足够聪明,可以知道订单与客户有关,并且它会将客户(所有者)引用设置为该特定客户。现在不是null了。但是,因此没有任何东西被持久化,对象还没有 ID。

context.SaveChanges(); // ids updated

瞧。现在 EF 已将对象插入数据库。它接收 ID,并使用正确的 ID 更新对象。

于 2013-03-05T10:12:41.313 回答