DbContext vs ObjectContext - 导航属性行为更改

时间:2017-04-12 16:54:40

标签: entity-framework-6 dbcontext objectcontext

我正在将一个大型项目从ObjectContext迁移到DbContext,EF6.1.3。刚遇到一个难以在源代码中跟踪可靠实例的问题,我想知道是否有可以模拟ObjectContext行为的方法。

考虑两个类,父和子。 Parent具有零个或多个Child对象。在表级别,Child具有ParentID列,该列与Parent对象中的ID列处于FK关系。以下是我为说明问题而生成的两个POCO类:

Partial Public Class Parent
    Public Property ID As Integer

    Public Overridable Property Children As ICollection(Of Child) = New HashSet(Of Child)

End Class

Partial Public Class Child
    Public Property ID As Integer
    Public Property ParentID As Integer

    Public Overridable Property Parent As Parent

End Class

这是一个用来说明问题的小程序:

  Sub Main()
    Using session As New testEntities
      Dim parent = session.Parents.Add(session.Parents.Create)
      Dim child = session.Children.Create
      parent.Children.Add(child)
      Console.WriteLine(child.Parent Is Nothing)
      session.SaveChanges()
      Console.WriteLine(child.Parent Is Nothing)
    End Using

使用ObjectContext实现,将Child添加到Parent也将设置Child的Parent属性。使用DbContext,在提交会话之前不会发生这种情况。

在我正在迁移的代码中,有几个地方(我们到目前为止已经找到),其中代码将被传递相当于已添加到Parent的Child对象,然后尝试通过孩子的父母财产。这些编译正确,但运行时行为被DbContext“破坏”。 查找使用此模式的所有此类实例将非常昂贵,并且很容易错过将继续在运行时导致问题的情况。任何人都可以建议一个允许代码按原样工作的解决方法吗?我想我们可以修改TT文件来生成我们自己的类而不是Children属性的HashSet,实现一个引用依赖属性的构造函数,以及一个更新依赖属性的Add方法。然而,在我们走这条路之前,有什么比我们可能错过的更简单吗?

1 个答案:

答案 0 :(得分:1)

我不完全确定这会奏效,但我认为值得一试。首先,在添加父项和子项后,尝试在DbContext上调用它:

ChangeTracker.DetectChanges()

如果这会产生你想要的结果,你可能会创建自己的DbSet,只要调用Add就会自动调用它...即使你必须使用Shadow the Add方法。 (希望只有一个你可以处理的事件。)