我正在将一个大型项目从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方法。然而,在我们走这条路之前,有什么比我们可能错过的更简单吗?
答案 0 :(得分:1)
我不完全确定这会奏效,但我认为值得一试。首先,在添加父项和子项后,尝试在DbContext上调用它:
ChangeTracker.DetectChanges()
如果这会产生你想要的结果,你可能会创建自己的DbSet,只要调用Add就会自动调用它...即使你必须使用Shadow the Add方法。 (希望只有一个你可以处理的事件。)