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完全不参与。 您可以手动设置订单对象的客户。 通常我在Add
或Remove
方法中管理双向关联。 即向订单集合添加订单,并将所有者设置this
。 这取决于你。 默认情况下,订单所有者将为null
。 下一个:
context.Customers.Add(customer); // order.Customer is customer, but no ids
这是EF。 数据库没有任何内容。 但 EF足够聪明,知道订单与客户有关,并且它将设置客户(所有者)对该特定客户的引用。 它不再是null
。 但是,因此没有任何东西被持久存在,对象还没有ID。
context.SaveChanges(); // ids updated
瞧。 现在EF已将对象插入数据库。 它接收到ID,并使用正确的ID更新了对象。