实体框架4并验证关系集合中的非持久对象

时间:2010-02-25 16:37:16

标签: entity-framework entity-relationship

当新对象可能依赖于持久对象或其他新对象时,关于实体框架和在持久化之前验证新对象(或者换句话说调用.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之前保留它吗?

此致

3 个答案:

答案 0 :(得分:0)

您的关系的基数是您模型的一部分,不需要单独验证。如果您需要1 .. *而不是0 .. *,那么定义模型,EF将为您验证。

答案 1 :(得分:0)

我会考虑首先使用简化的保存,只保存当前(游戏?)状态而不是所有实体系统对象。喜欢:“玩家处于等级@ 123,456项目Foo,Bar”。

另一种方法可能是序列化然后反序列化您的对象。从根对象开始,在序列化期间,还序列化所有依赖项。此选项可能非常复杂,尤其是对于打开的文件,conenxions和其他不可序列化的元素。

答案 2 :(得分:0)

您的代码有点脱节。

您已通过调用

将MyEntity1附加到ObjectContext
DataContext.Entity1s.Add(MyEntity1);

但尚未附加(或未在示例中显示)MyEntity2到Context。

除此之外,简短的回答是。您的验证将成立,并将作为有效传递。

<强>推理:

实体操作独立于对象上下文。在实体中添加或删除关联时,更改会反映在实体上,无论其与管理它的对象上下文的状态如何。

<强>陷阱

当您向Context调用SavingChanges()时,您的真正问题就在于此。在尝试持久化实体(即实体图)时,您必须意识到上下文对对象状态非常敏感。这意味着您无法保留混合附加和分离实体的实体图。