代码之家  ›  专栏  ›  技术社区  ›  Moo

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

  •  1
  • Moo  · 技术社区  · 14 年前

    当新对象可能依赖于持久化对象或其他新对象时,关于实体框架和在持久化新对象之前验证新对象(或者换句话说,调用.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()是否可以同时返回持久性MyEntity1和非持久性MyEntity1,从而导致验证成功?

    或者在将其附着到髓鞘2之前,我应该坚持髓鞘1吗?

    当做

    3 回复  |  直到 14 年前
        1
  •  0
  •   Tri Q Tran    14 年前

    你的代码有点混乱。

    通过调用

    DataContext.Entity1s.Add(MyEntity1);
    

    但尚未将MyEntity2附加(或在示例中未显示)到上下文。

    除此之外,简短的回答是 是的 . 您的验证将保持为真,并将作为有效通过。

    推理:

    实体操作独立于对象上下文。在实体中添加或移除关联时,更改将反映在实体上,而不管其相对于管理它的对象上下文的状态如何。

    陷阱

    真正的问题是调用上下文的savingChanges()时。在尝试持久化实体(即实体图)时,必须注意上下文对对象状态非常敏感。这意味着您不能持久化混合附加和分离实体的实体图。

        2
  •  0
  •   Craig Stuntz    14 年前

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

        3
  •  0
  •   Wernight    14 年前

    我会考虑首先使用一个简化的保存,它只会保存您的 当前(游戏?)状态 不是所有的实体系统对象。比如:“玩家等级为123456个物品,foo,bar”。

    另一种方法是 序列化然后反序列化对象 . 从根对象开始,在序列化过程中,还要序列化所有依赖项。此选项可能非常复杂,特别是对于打开的文件、conenxion和其他不可序列化的元素。