2012-01-05 1 views
1

클라이언트 쪽 EntitySet에 추가 할 때 오류가 발생합니다. 다음 코드는 간헐적으로 Add 메서드에서 실패합니다.예기치 않은 "동일한 ID를 가진 엔터티가이 EntitySet에 이미 있습니다"?

// On the DB side this has a primary key field of IDENTITY(1,1) called Id 
var map = new EpisodeDictionaryMap(); 
map.DictionaryName = dictionary; // String 
map.Section = section; // String 
map.DictionaryVersion = version; // Int32 

episode.EpisodeDictionaryMap.Add(map); 

나는 또한 모든 이제 다시 전에 모든이 코드를 호출하지 (다른 사람의 사이에) Episode에 대한 EntitySets에 Clear()EpisodeDictionaryMap를 호출하지만 해요, 때 응용 프로그램 내에서 다른 화면으로 사용자 변경됩니다. 이것은 최근의 변화이므로 문제의 일부가 될 수 있습니다. 그것은이 나타날 것 DomainContext의 EpisodeDictionaryMap 수집을 조사하면

는 가끔 전에 절약에 기대하는 것처럼, 0의 ID와 각 인스턴스 사실 여러에서 '새'EpisodeDictionaryMap이 있고, 이러한 경우에 저장 문제없이 완료 올바른 ID가 클라이언트 측 엔티티에 지정됩니다.

EntitySet에 ID가 0 인 항목이 여러 개있는 것은 문제가되지 않는다는 것을 감안할 때 (적어도 "새로운"상태 인 동안은) 나는 그렇지 않습니다. 오류 메시지가 무엇을 말하려고하는지 이해하십시오.

작곡이 문제가 될 수있는 몇 가지 관련 질문에 주목했지만 사용하지는 않습니다. 에피소드 참조 자체를 제외하고는 다른 외부 키 참조도 없으며 때로는이 오류가 발생할 수도 있습니다.

제안, 생각? 많은 감사합니다!

편집 :

이 이

전체 예외 (더 내부 예외가 존재하지 않는)

System.InvalidOperationException occurred 
    Message=An entity with the same identity already exists in this EntitySet. 
StackTrace: 
    at System.ServiceModel.DomainServices.Client.EntitySet.AddInternal(Entity entity) 
    at System.ServiceModel.DomainServices.Client.EntitySet.<Add>b__5(EntitySet l, Entity e) 
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.Visit(Entity entity) 
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.VisitEntityCollection(IEntityCollection entityCollection, PropertyInfo propertyInfo) 
    at System.ServiceModel.DomainServices.Client.EntityVisitor.Visit(Entity entity) 
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.Visit(Entity entity) 
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.VisitEntityRef(IEntityRef entityRef, Entity parent, PropertyInfo propertyInfo) 
    at System.ServiceModel.DomainServices.Client.EntityVisitor.Visit(Entity entity) 
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.Visit(Entity entity) 
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.VisitEntityRef(IEntityRef entityRef, Entity parent, PropertyInfo propertyInfo) 
    at System.ServiceModel.DomainServices.Client.EntityVisitor.Visit(Entity entity) 
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.Visit(Entity entity) 
    at System.ServiceModel.DomainServices.Client.EntitySet.AddAttachInferrer.Infer(EntityContainer container, Entity entity, Action`2 action) 
    at System.ServiceModel.DomainServices.Client.EntitySet.Add(Entity entity) 
    at System.ServiceModel.DomainServices.Client.EntityCollection`1.Add(TEntity entity) 
    at TangoSoft.Client.EpisodeExtensions.SaveDictionaryVersion(Episode episode, String dictionary, String section, Int32 version) 
+0

테이블 내용을 보았습니까?아마도 자동 생성 된 PK가 간헐적으로 기존 행과 충돌합니다 – Rob

+0

키는 실제로 클라이언트 코드에 의해 생성되지 않고 DB 삽입시 생성되므로 실제로 이해가되지 않습니다. 그렇더라도 클라이언트의 ID를 별개이지만 사용하지 않는 값 (-1234)으로 설정하면 오류가 발생하므로 불만을 제기하는 Id 값 자체는 아닙니다. 그것은 내가 오류를 이해하는 데 혼란 스러울 부분입니다. –

+0

당신 말이 맞아요. 나는 당신이 당신의 변화를 다시 DB에 저장하지 않는다는 것을 깨닫지 못했습니다. 비록 당신이라면, DB에서 생성 된 값으로도 PK에서 충돌이 발생할 수 있습니다. 코드에서 외래 키를 다른 위치에 설정 했습니까? 아니면 설정하지 않았습니까? 어디에서'SaveChanges()'를 호출합니까? 나는 예외의 개별 속성 (아마도'InnerException'이 있음)을 검사하고 단서를 찾아 디버깅을 계속할 것이다. – Rob

답변

0

를 참조하십시오 난 단지 간접적으로 erroring 개체에 연결된 개체가 여전히 상황에 주위를 어슬렁 및 유지 것을 발견 ID가 0 인 엔티티입니다. 비 조회 데이터가 포함 된 각 EntitySet을 지 웠습니다. 이 아니며이 아닙니다. VS 내에서 조사하는 것은 문제의 엔터티를 실제로 쉽게 찾을 수있는 방법을 제공하지 못했지만 ANTS로 프로파일 링하면 내 '조회'EntitySet 엔터티에만 연결된 너무 많은 것들이 밝혀졌습니다.

이에 대한 나의 '수정'입니다 내 EntitySets의 모든 아래로 지금 명확 : 여전히 날이 간헐적으로 오류라고이다 배플 무엇

foreach (var set in _context.EntityContainer.EntitySets) 
{ 
    set.Clear(); 
} 

; 때로는 Id 0T 유형의 여러 엔티티가 컨텍스트에 있었고 다른 경우에는 오류가 발생하는 경우는 문제가되지 않았습니다.

0

확인 문제의 테이블에 대한 기본 키 (XML에서 .edmx 파일을 끌어가) 가지고 StoreGeneratedPattern = 두 섹션 모두에서 "신원". 디자이너를 통한 EF가 한 섹션을 수정하지만 다른 섹션은 수정하지 않는 알려진 오류가 있습니다. 두 섹션이를 찾습니다 :

<EntityType Name="TIMELINE"> 
      <Key> 
      <PropertyRef Name="ID"/> 
      </Key> 

    <Property Name="ID" Type="decimal" Nullable="false" Precision="19" StoreGeneratedPattern="Identity" /> 

시행 착오를 많이 후 EF4: Bug in StoreGeneratedPattern SSDL

+0

흥미 롭습니다 ...이 버그는 몇 달 전에 있었던 문제에 대해 다르게 나타납니다 : http://stackoverflow.com/questions/3661509/objectcontext-savechanges-violates-primary-key-throws-updateexception – Rob

+0

EpisodeDictionaryMap의 모든 언급은 다음과 같습니다. StoreGeneratedPattern = Id 열의 ID로 설정되므로 불행히도 관련성이없는 것으로 보입니다. –

+0

다른 소스 인 Linqpad에서 레코드를 추가 할 수 있습니까? Linqpad에 문제가 있으면 다른 범인을 식별 할 수 없으며 데이터베이스의 트리거가 새 기본 키를 생성한다고 말하면 실패 지점이 될 수 있습니다. ??? – OmegaMan