2014-11-22 1 views
1

정말 이상한 글리치가 발생하며 엔티티 프레임 워크가 잘못되었다고 생각합니다. 여기에 기본적인 시나리오가 있습니다. 나는 네비게이션 프로퍼티 모음 인 Bar라는 엔티티 객체를 가지고있다. 이 컨텍스트에서 Foo는 엔티티 프레임 워크 변경 추적에 의해 추적됩니다. 예상대로 내가 다음 코드를 실행,하지만 난 VAR NewBars의 =의 CreateBars() 줄에 중단 점을 넣으면 결과가C# 엔티티 프레임 워크 내 목록의 내용을 변경합니다.

var NewBars = CreateBars(); //CreateBars returns a List<Bars> with two items 

//After this code is ran, Foo.Bars AND NewBars will both be lists with 4 items. 
//I think its because Foo.Bars has dynamic proxies, entity framework edits bars 
//To re-insert the overwritten proxies. 
Foo.Bars = NewBars; 

매우 이상하고, 그것을 통해 한 조각 씩 단계, 모든 것이 나올 것입니다. Foo.Bars는 두 항목 목록이되고 NewBars는 두 항목 목록이됩니다. 그러나 중단 점이없는 실행을 실행하거나 Foo.Bars = NewBars를 설정 한 후 중단 점이 발생하면 두 목록 모두 기적적으로 4 개의 항목 목록으로 변경됩니다. 그 오른편의 가치 목록조차도 바뀌고 있다는 것은 저에게 이상합니다.

한 지점에서 중단 점에서 실행이 중단 된 경우에도 newbars의 내용을 검사했고 처음에는 2 번, 다음에 보았을 때는 2 번이었습니다. 그것은 프로그램이 중단 된 동안 바뀌었고, 그래서 나는 무언가가 무대 뒤에서 진행되고 있음을 안다.

문제는 프록시를 다시 삽입하기 때문에 기본 키 충돌을 얻는 것입니다. 프록시가 다시 삽입되지 않으면 모든 것이 정상입니다. 임 궁금해, 어떻게이 문제를 해결합니까? Foo.Bars를 새로운 항목 목록으로 설정하기 만하면됩니다. 이 문제에 대한 어떤 방향으로 큰 감사하겠습니다! 감사!

답변

1

newBars을 할당하기 전에 에있는 Bar에 어떤 일이 발생하고 싶습니까?

어떤 식 으로든 처리해야합니다. 그것들은 데이터베이스의 Bar 테이블에있는 행에 의해 다시 표시됩니다.

dbContext.Bars.RemoveRange(Foo.Bars); 
dbContext.SaveChages(); 

다음 할당 새 바 : 당신은 여전히 ​​이전 Bar의이 DB에 존재하려는 경우 또는

Foo.Bars = NewBars; 
dbContext.SaveChanges(); 

당신은 완전히 같은 이러한 오래된 Bar의를 제거 할 수 있습니다 하지만 Foo에 연결하면 안됩니다.

Foo.Bars=null; 
Foo.Bars = newBars; 
dbContext.SaveChanges(); 

(물론 이것은 db 스키마에서 제약 조건을 위반하지 않고 이것을 허용한다고 가정합니다.)

+0

글쎄, 어떤 경우에는 CreateBars가 이미 목록에있는 내용을 생성하고 다른 경우에는 아마도 생성하기 때문에 생각한 것 같습니다. 다른 목록을 생성합니다. 그러나 기본적으로 두 경우 모두 데이터베이스에 이미있는 값이 무엇이든간에 기본적으로 쓰기를 원했습니다. 그리고 새 값이 있으면 그냥 추가 할 수 있습니다.하지만 새로운 세트를 생성하기 전에 목록을 지울 수있을 것 같습니다. –

+0

새 항목을 만드는 대신 기존 항목을 가져 오기 위해'CreateBars() 같은 이드와. 'newBar = new Bar {... ....}'가 아닌'newBar = dbContext.Bars.Find (id)'와 같은 일을하는 경우, 반환 된리스트에 결과를 추가하는 것과 같은 문제는 없어야합니다 –