2013-03-05 111 views
1

我使用EF5,POCO數據庫第一種方法。比方說,我需要創建一個新的客戶和新的訂單: -實體框架5 POCO - 創建和管理關係

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

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

customer.Orders.Add(order); 

難道我真的要包括那​​些最後三行建立的關係?這裏要指出的是,我正在內存中創建實體層次結構,並在很長時間內操縱它,直到用戶點擊「保存」。

什麼讓我感到困惑的是創建幾個新的客戶對象的想法。每一個都會以ID 0結束(在被持續之前)。我的代碼中有各種地方,我使用Order的CustomerId屬性進行操作。如果有幾個新客戶(ID 0),那麼我如何才能找到合適的客戶?或者我應該總是使用Order.Customer而不是Order.CustomerId(在這種情況下,在上面的代碼中擺脫ID分配是否安全)?

回答

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的對象。

+0

在你的例子中,我能否在顧客傳遞到上下文之前遍歷Order.Customer *?請記住,我將在它們持久保存到數據庫之前操作/遍歷這些實體層次結構。我不認爲POCO實體有任何建立「雙向」關係的內置邏輯,即僅僅執行'customer.Orders.Add(order)'不會填充訂單實體的'.Customer'和'。 CustomerId'屬性,是嗎? – 2013-03-05 11:45:51

+0

@AndrewStephens查看更新的答案。我已經逐步描述了發生的事情。 – 2013-03-05 12:08:27