实体框架5 POCO - 创建和管理关系

时间:2013-03-05 10:04:31

标签: c# entity-framework

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

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

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

customer.Orders.Add(order);

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

令我困惑的是创建几个新的Customer对象的想法。每个将结束ID为0(在被持久化之前)。我的代码中有很多地方可以使用Order的CustomerId属性执行某些操作。如果有几个新客户(ID 0),那么我该如何获得正确的客户?或者我应该始终使用Order.Customer而不是Order.CustomerId(在这种情况下,在上面的代码中摆脱ID分配是否安全)?

1 个答案:

答案 0 :(得分:1)

当您添加新客户时,将插入整个图表并正确设置关系。您无需手动设置关系(请参阅Add One-to-Many Entities):

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

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

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

BTW:有一篇很好的MSDN文章Defining and Managing Relationships值得一读。


更新:以下是您使用EF时的情况:

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

此时EF完全不参与。您可以手动设置订单对象的客户。通常我会在AddRemove方法中管理双向关联。即将订单添加到订单集合,并将所有者设置为this。这取决于你。默认情况下,订单所有者为null。下一个:

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

这是EF。数据库没有任何内容。 但是 EF非常聪明,知道订单与客户有关,并且会为此特定客户设置客户(所有者)参考。它不再是null。但是,因此没有任何东西存在,对象还没有ID。

context.SaveChanges(); // ids updated

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