【问题标题】:How can I change the EntityState of an Entity that is part of a child collection to a detached entity如何将属于子集合的实体的 EntityState 更改为分离的实体
【发布时间】:2014-01-27 15:03:56
【问题描述】:

我有一个新的父实体,它具有Lanugages 作为导航属性。在父实体属于域上下文之前,我Add 现有语言,将其实体状态设置为Added。语言实体已经存在于数据库中,但是因为我必须在有上下文之前将它添加到父实体中,所以我没有机会Attach 语言实体而不是添加它。

如何在域上下文上调用SaveChanges() 之前更改我的语言条目的EntityState,或以其他方式解决此问题?

【问题讨论】:

    标签: c# entity-framework wcf-ria-services


    【解决方案1】:

    您可以通过上下文 ObjectStateManager 更改 EntityState,如下所示:

    this.ObjectContext.ObjectStateManager.ChangeObjectState(myEntity, EntityState.Added);
    

    其中 EntityState 枚举为 here ...

    【讨论】:

    • 这仅适用于服务器端。我需要一个适用于客户端的解决方案(Silverlight)。
    • 你不能 (1) 创建你的父级 (2) 将其添加到上下文 (3) 将子语言加载到上下文中 (4) 将子语言附加到父级 (5) SubmitChanges 吗?我认为如果这发生在同一上下文中,那么您的孩子应该获得正确的 EntityState。
    • 绝对是完美的世界。但不幸的是,代码的布局方式(不是我的工作,继承的)使得这种操作顺序基本上是不可能的。
    • 如果您处于断开连接的上下文情况(听起来像您),那么我知道解决 EF 尝试将现有对象添加到新实体的问题的唯一方法是为您的类对象提供自己的 ObjectState 属性(例如,通过接口),然后在服务器端将这些对象状态映射到 EntityStates,以便 EF 可以通过附加而不是添加来获取更改并正确处理实体。
    • 所以,我得到了这个工作,但这不是一个优雅的解决方案。众所周知,我的语言实体本质上是常数,它们永远不会被添加或改变。我已经覆盖了服务器上的SaveChanges() 并捕获了Language 的任何实体并将它们改回未修改的状态。相当丑陋的 IMO,但我猜可以完成工作。
    【解决方案2】:

    从您在另一个答案中的评论中,您提到语言实体本质上是常量。这是否意味着主键值不会改变并且您知道?如果是这样,这可能会起作用:

    Public Class MyParent
        Public Property Language as Language  '<--- navigation property
        Public Property LanguageID as Integer '<--- primary key foreign key
    End Class
    
    Dim context as New MyContext
    Dim p as New MyParent
    p.LanguageID = 42      '<--- you language "constant" primary key value
    context.MyParents.Add(p)
    context.SubmitChanges(...)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-25
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多