2010-02-25 33 views
1

關於實體框架和在新對象持久化之前驗證新對象的最佳實踐(或換句話說調用.SaveChanges())依靠持久對象還是其他新對象?實體框架4和驗證關係集合中的非持久對象

例如,考慮以下幾點:

Entity1 MyEntity1 = new Entity1(); 
MyEntity1.Name = "Hornblower"; 
DataContext.Entity1s.Add(MyEntity1); 

.... Other code .... 

Entity2 MyEntity2 = new Entity2(); 
MyEntity2.Entity1s.Add(MyEntity1); 

.... Other code .... 

// Validate that MyEntity2 has at least 1 Entity1 relationship 
if (MyEntity2.Entity1s.Count() > 0) 
{ 
    // Valid - save it 
    DataContext.SaveChanges(); 
} else { 
    // Invalid - handle it 
} 

在上面的僞代碼中,這會是驗證所需要的條件的有效和正確的方法 - 可以在.Count之間()被後返回都依據持久MyEntity1s和非持久MyEntity1s,因此在上述情況下導致驗證成功?

或者我應該堅持MyEntity1之前,將其附加到MyEntity2?

問候

你的人際關係的武

回答

0

你的代碼是有點DIS-接合。

您已通過調用

DataContext.Entity1s.Add(MyEntity1); 

附MyEntity1到ObjectContext的,但還沒有連接(或在本例中沒有示出)MyEntity2到語境。

除此之外,簡短的回答是是的。您的驗證將保持正確,並將通過有效。

推理:

實體操作是獨立的對象上下文。在向實體添加或刪除關聯時,更改將反映在實體上,而與其管理它的對象上下文相關的狀態無關。

陷阱

調用SavingChanges()的背景下,當你真正的問題會。當試圖堅持實體(即實體圖)時,您必須意識到上下文對於對象狀態非常敏感。這意味着您不能堅持混合連接和分離實體的實體圖。

0

基數是模型的一部分,不需要單獨的驗證。如果您需要1 .. *而不是0 .. *,那麼請定義模型,EF將爲您驗證它。

+0

嗯,我想我是問爲 - 我從來沒有真正即使想到了這一點,是的,它意味着我的設計是錯誤的。謝謝! – Moo 2010-02-25 16:43:31

+0

啊,看過了,這就是爲什麼我沒有在模型中實現它 - EF似乎沒有辦法指定Entity1-Entity2關係應該由Entity2上的'1或更多'組成側,只是'0或1'或'1'。所以它回到驗證來做到這一點。 – Moo 2010-02-25 16:52:46

+0

你可以從另一面做到這一點,但是從你的問題來看,這是否適用於此。取決於你如何使用這一方面。 – 2010-02-25 17:26:46

0

我會考慮首先使用一個簡化的保存,只會保存您當前(遊戲)狀態的而不是所有的實體系統對象。例如:「玩家在等級@ 123,456物品Foo,酒吧」。

另一種方式可能是序列化,然後反序列化你的對象。從一個根對象開始,在序列化期間,也序列化所有的依賴關係。此選項可能非常複雜,特別是對於打開的文件,conenxions和其他不可序列化的元素。