큰 프로젝트를 ObjectContext에서 DbContext, EF6.1.3으로 마이그레이션하려고합니다. 소스 코드에서 안정적으로 인스턴스를 추적하기 어려운 문제에 직면하고 ObjectContext 비헤이비어를 시뮬레이트 할 수있는 방법이 있는지 궁금합니다.DbContext 대 ObjectContext - 탐색 속성 동작 변경
두 클래스 Parent 및 Child를 고려하십시오. 부모는 0 개 이상의 Child 객체를가집니다. 테이블 수준에서 Child는 부모 개체의 ID 열과 FK 관계에있는 ParentID 열을가집니다. 아이를 부모에게 추가 것, ObjectContext의 구현과
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
: 여기
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
하고 문제를 설명 할 수있는 작은 프로그램입니다 : 여기가 문제를 설명하기 위해 생성 된 두 POCO 클래스는 또한 Child의 Parent 속성을 설정하십시오. DbContext를 사용하면 세션이 커밋 될 때까지이 작업이 수행되지 않습니다.
코드에서 마이그레이션 중입니다. 코드는 부모 개체에 추가 된 자식 개체와 동일한 코드가 전달되는 곳으로 여러 곳이 있습니다. 그 다음 부모 개체를 참조하려고 시도합니다. Child의 Parent 속성 이들은 올바르게 컴파일되지만 DbContext를 사용하면 런타임 비헤이비어가 "손상"됩니다. 이 패턴이 사용되는 모든 인스턴스를 찾는 것은 비용이 많이 들고 실행 시간에 문제가 발생하는 경우를 놓치기 쉽습니다. 누구나 코드를 그대로 작동시킬 수있는 해결 방법을 제안 할 수 있습니까? Children 속성의 HashSet 대신 자체 클래스를 생성하고 종속 속성에 대한 참조를 사용하는 생성자를 구현하며 종속 속성을 업데이트하는 Add 메서드를 사용하도록 TT 파일을 수정할 수 있다고 가정합니다. 우리가 그 길을 가기 전에, 우리가 놓친 것보다 더 간단한 것이 있습니까?
이건'ObjectContext' 또는'DbContext'와 관련된 것이 아니라 엔티티 클래스 (POCO 대 특별한 것)라고 생각합니다. 'ObjectContext'와 똑같은 엔티티 클래스를 사용했다는 말입니까? –
그 정도까지는 사실입니다. ObjectContext를 사용하면 탐색 속성이 EntityCollection 유형에 의해 뒷받침됩니다. 그러나 DbContext를 사용하면 엔티티 자체가 프록시로 래핑되어 비슷한 작업을 수행 할 수 있습니다. –
아, 아니요, 클래스는 ' 두 경우 모두 같지만 관련 TT 파일에 의해 생성 된 것입니다. –