繁体   English   中英

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

[英]Entity Framework 5 POCOs - creating and managing relationships

我正在使用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更新了对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM