2017-04-12 4 views
0

큰 프로젝트를 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 파일을 수정할 수 있다고 가정합니다. 우리가 그 길을 가기 전에, 우리가 놓친 것보다 더 간단한 것이 있습니까?

+0

이건'ObjectContext' 또는'DbContext'와 관련된 것이 아니라 엔티티 클래스 (POCO 대 특별한 것)라고 생각합니다. 'ObjectContext'와 똑같은 엔티티 클래스를 사용했다는 말입니까? –

+0

그 정도까지는 사실입니다. ObjectContext를 사용하면 탐색 속성이 EntityCollection 유형에 의해 뒷받침됩니다. 그러나 DbContext를 사용하면 엔티티 자체가 프록시로 래핑되어 비슷한 작업을 수행 할 수 있습니다. –

+0

아, 아니요, 클래스는 ' 두 경우 모두 같지만 관련 TT 파일에 의해 생성 된 것입니다. –

답변

1

이 방법이 효과가 있을지는 모르겠지만 시도해 볼 가치가 있다고 생각합니다. 당신은 부모와 자녀를 추가 한 후 첫째는 DbContext에이를 호출하려고 :

ChangeTracker.DetectChanges() 

을이 당신이 원하는 결과 경우 추가가 호출 될 때마다, 당신은이 작업을 자동으로 호출 자신의 DbSet을 만들 수 있습니다 ... 비록 Add 메서드를 Shadow해야만한다. (희망적으로 당신이 처리 할 수있는 이벤트가 있습니다.)

+0

DetectChanges가 작동합니다. 아직 솔루션에 통합하려고 시도하지 않았지만, 이미 HashSet을 서브 클래 싱하는 접근법을 작성 했으므로 –