7

저는 몇 달 동안 ASP.NET MVC 응용 프로그램을 작성했습니다. 처음 작업을 시작했을 때 Entity Framework 4.3 (코드 - 첫 번째 마이그레이션)을 사용했습니다. 내가하는 동안 내 MainClient 테이블에서 업데이트를 시도하는 몇 가지 문제가 발생했습니다. MainClient는 클라이언트의 모든 기본 정보를 포함하며 BP 클라이언트 테이블에 대한 1 : 1 관계를 가지고 있습니다. 여기에는 BP 모듈에 대한 사용권 계약과 관련된 클라이언트에 대한보다 구체적인 정보가 들어 있습니다. 둘 다 탭 컨트롤의 동일한 페이지에서 편집 할 수 있습니다.Entity Framework 4.3 vs. 5.0 차이점 업데이트

System.InvalidOperationException : An object with the same key already exists 
in the ObjectStateManager. The ObjectStateManager cannot track multiple objects 
with the same key. 

내가 내 컨트롤러 클래스에 갔을 때 객체 자체가 분리를 고려하고 디버깅하는 동안주의 : 그러나, 나는 EntityState.Modified되기에 MainClient 개체의 EntityState를 변경하려고 다음과 같은 예외가 점점에 보관 구원 받는다. 이 문제의 해결 방법은 this blog postthis SO question에있는 문제와 유사한 해결책을 적용했습니다. 여기에 다시 부착 개체에 대한 코드 편집 방법은 client라는 MainClient 객체에 전달되는 주어진 (지저분한, 내가 아는) 이후에보고하는 방법은 다음과 같습니다

var newClientObject = new MainClient { ClientID = client.ClientID }; 
Db.MainClients.Attach(newClientObject); 
Db.Entry(newClientObject).CurrentValues.SetValues(client); 

var bpClient = new BPClient { ClientID = client.ClientID, BaseClient = newClientObject }; 
if (client.BPClient != null) 
{ 
    Db.BostonpostClients.Attach(bpClient); 
    Db.Entry(bpClient).CurrentValues.SetValues(client.BPClient); 
} 

Db.SaveChanges() 

이 모든 테스트 케이스를 통해 잘하고 멋쟁이했다. 최근까지.

최근에 Entity Framework 5 (여전히 Code-First 사용)를 사용하도록 응용 프로그램을 업그레이드했습니다. MainClient 편집 페이지를 다시 테스트 할 때 오히려 엉뚱한 동작을 발견했습니다. 일부 필드는 편집 할 때 문제없이 저장됩니다. 다른 사람들은 DB에 절대로 커밋되지 않습니다. 그래도 다른 것들은 편집 할 대상의 유일한 부분 인 경우에만 계속 유지됩니다. 컨트롤러 클래스에있는 DbContext를 디버깅하여 페이지에서 컨트롤러 클래스로 전송 된 변경 사항이 아니라 ObjectStateManager에 MainClient 및 BPClient 개체가 모두 포함되어 있다는 사실을 발견했습니다. 그것은 뿐만 아니라 페이지에서 변경되었습니다! 여기서는 디버깅 중에 하나의 오류가 발생하지 않았 음을 언급해야합니다. SaveChanges() 후에도 오류가 발생하지 않습니다.

내가 시도하고 원래 있던 것과 코드를 복귀하기로 결정, 그것은 그 일의 논리적 인 방법으로 말을하는 것입니다 :

Db.Entry<BPClient>(client.BPClient).State = EntityState.Modified; 
Db.Entry<MainClient>(client).State = EntityState.Modified; 

Db.SaveChanges(); 

을 그리고 지금은 완전히 잘 작동합니다. InvalidOperationException이 없습니다. 그래서 그게 잘 해결되었습니다.

내게 아직도 괴로운 점은 5.0에서 변경된 기능으로 내 이전 수정본이 작동을 멈추고 나를 괴롭히는 것입니다. 이 코드가 4.3에서 제대로 작동했지만 5.0에서 제대로 작동하지 않은 이유는 무엇입니까? 5.0에서 그 코드가 너무 엉뚱한 데이타베이스에 무엇이 커밋 되었습니까?

왜 이런 일이 일어 났을까요?

+0

도움이 될 수 있습니다. Entity Framework 5 EF 4.3에서 열거 및 이동 솔루션 http://thedatafarm.com/blog/data-access/video-entity-framework-5-enums-and-moving-solution-from-ef-4-3/ – Aru

답변

0

이 문제는 직접 발생했습니다. IDbSet 클래스를 사용하여 데이터베이스 테이블을 채우고 있었는데, 내가 발견 한 것은 가상의 EF5가 게으른로드를 수행 할 때 (데이터베이스의 다른 객체가있는 가상의 속성)였습니다. 즉, 가상 속성에 대한 새 기본 키를받습니다. 글쎄, 만약 내가 EF 5를 참조하고자하는 객체와 관련된 특정 id를 가지고 있지 않다면 양방향 관계를 만들려고 시도한다. DBContext에 어떤 속성을 매핑 할 것인지 구체적으로 말하지 않으면 허용되지 않는 두 개의 외래 키를 동일한 객체에 설정합니다. 희망이 도움이됩니다.

+0

감사 내 질문에 대답하려고 애쓰다. 나는 이것이 여기의 경우라고 생각하지 않는다.저는 이미 MainClient와 BPClient간에 1 : 1을 쌍방향 관계 (가상 속성과 ID 모두)로 설정했습니다. 나는 왜 코드가 갑자기 작동하지 않는지 알아 내려고하고있다. – IronMan84

+0

virutal 속성 만 사용하면 지연로드가 발생합니다. 속성 사이의 dbcontext에서 동일한 맵을 사용합니까? – Robert

+0

FLuent API가 아닌 Data Annotation을 사용하고 있습니다. 매핑은 전적으로 DbContext가 아니라 개체 자체에 대한 것입니다. 이와 같은 방법으로 코드에 영향을 미칠 수있는 느린 로딩과 관련하여 4.3과 5.0 사이에 어떤 일이 발생 했습니까? – IronMan84

관련 문제