当新对象可能依赖于持久对象或其他新对象时,关于实体框架和在持久化之前验证新对象(或者换句话说调用.SaveChanges())的最佳实践是什么?
例如,请考虑以下事项:
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 :(得分:0)
您的关系的基数是您模型的一部分,不需要单独验证。如果您需要1 .. *而不是0 .. *,那么定义模型,EF将为您验证。
答案 1 :(得分:0)
我会考虑首先使用简化的保存,只保存当前(游戏?)状态而不是所有实体系统对象。喜欢:“玩家处于等级@ 123,456项目Foo,Bar”。
另一种方法可能是序列化然后反序列化您的对象。从根对象开始,在序列化期间,还序列化所有依赖项。此选项可能非常复杂,尤其是对于打开的文件,conenxions和其他不可序列化的元素。
答案 2 :(得分:0)
您的代码有点脱节。
您已通过调用
将MyEntity1附加到ObjectContextDataContext.Entity1s.Add(MyEntity1);
但尚未附加(或未在示例中显示)MyEntity2到Context。
除此之外,简短的回答是是。您的验证将成立,并将作为有效传递。
<强>推理:强>
实体操作独立于对象上下文。在实体中添加或删除关联时,更改会反映在实体上,无论其与管理它的对象上下文的状态如何。
<强>陷阱强>
当您向Context调用SavingChanges()时,您的真正问题就在于此。在尝试持久化实体(即实体图)时,您必须意识到上下文对对象状态非常敏感。这意味着您无法保留混合附加和分离实体的实体图。