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



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

考虑两个类,父级和子级。 父级有零个或多个子对象。在表级别,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 的父属性。使用 DbContext 时,在提交会话之前不会发生这种情况。

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

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

ChangeTracker.DetectChanges()

如果这产生了您想要的结果,您也许能够创建自己的 DbSet,每当调用 Add 时,它都会自动调用它...即使必须隐藏 Add 方法。(希望只有一个事件你可以处理。

最新更新