entity framework5 POCO – 创建和管理关系

我正在使用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分配是否安全)?

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

 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完全不参与。 您可以手动设置订单对象的客户。 通常我在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更新了对象。