2010-02-25 32 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和其他不可序列化的元素。