2010-06-22 5 views
1

이로 인해 1 주일 동안 나에게 큰 어려움이 생겼습니다.ComplexType 속성이있는 엔터티를 삭제할 수 없습니다 (Entity Framework 4)

public class SuggestionVote 
{ 
    public virtual int ID { get; set; } 
    public virtual Suggestion Suggestion { get; set; } 
    public virtual User User { get; set; } 
    public virtual VoteTypeWrapper VoteType { get; set; } 
    public virtual DateTime DateVoted { get; set; } 

    // Equality overrides omitted 
} 

VoteTypeWrapper 실제로 기사 on how to fake enums in Entity Framework 4에 따라 열거 래퍼이며, 다음과 같습니다 : 다음 VoteType 열거 존재와

public class VoteTypeWrapper 
{ 
     private VoteType _type; 

     public int Value 
     { 
      get { return (int)_type; } 
      set { _type = (VoteType)value; } 
     } 

     public VoteType EnumValue 
     { 
      get { return _type; } 
      set { _type = value; } 
     } 

     public static implicit operator VoteTypeWrapper(VoteType voteType) 
     { 
      return new VoteTypeWrapper { EnumValue = voteType }; 
     } 

     public static implicit operator VoteType(VoteTypeWrapper voteTypeWrapper) 
     { 
      return voteTypeWrapper == null ? VoteType.NotVoted : voteTypeWrapper.EnumValue; 
     } 
} 

:

나는이처럼 보이는 클래스가

public enum VoteType 
{ 
    Up, 
    Down, 
    NotVoted 
} 

나는 또한 모델 디자이너 NED ComplexType :

<ComplexType Name="VoteTypeWrapper" > 
    <Property Type="Int32" Name="Value" Nullable="false" /> 
</ComplexType> 

나는 다소에 StackOverflow의 투표 시스템과 같은 작품을 구현하고있어 투표 시스템은 : 사용자는 위 또는 아래로 투표 할 수있다; 두 번째 투표로 이전 투표를 취소하고 반대 방향으로 투표 (즉, 이전에 투표했을 때 아래로)하면 투표가 취소됩니다.

지금 문제가 있습니다. 한 번 투표는 매력 같이 작동하고 모든 가치는 데이타베이스에 정확하게 저장된다. 그러나 투표를 취소하는 것은 일을 거부합니다. 투표를 취소하려면 기본적으로 삭제 취소를 위해 투표를 표시 한 다음 SaveChanges으로 문의하십시오. 는 즉시 내가 InvalidOperationException 나에게 다음과 같은 메시지를주고 발생하는 것처럼 :

The entity of type 'System.Data.Entity.DynamicProxies.SuggestionVote_4A3949F5B95E9A51567509467230FD7CEA0FB7761C3AC9C8C2BBC62BCAA033AF' 
references the same complex object of type 'Web.Model.VoteTypeWrapper' more than once. 
Complex objects cannot be referenced multiple times by the same entity. 

난 그냥 그것을 얻을하지 않습니다. 아무도 내가 뭘 잘못할 수 있는지 아는가? 나는 하루 동안 Google을 이용했지만 아무런 소용이 없었습니다.

+0

이것이 이유 였습니까? 복잡한 유형? – Meligy

+0

나는 지금 같은 문제가 있다고 생각합니다. 엔티티는 또한 enum에 대한 복합 유형 속성을가집니다. 결론으로 빨리 넘어 가기를 원하지 않는다. – Meligy

+0

@Mohammed : 복잡한 경우 인'VoteTypeWrapper'는 오류 메시지에 언급 된 속성이므로 (위 참조) 생각하는 것이 안전하다고 생각합니다. 복잡한 유형이 이유였습니다. 또한, 내가 그것을 제거하자마자 모든 것이 효과가있었습니다. 마치 오리처럼 보이면 오리처럼 들릴 것입니다 ...;) –

답변

0

글쎄, 마침내 그걸 해결하려고했지만 ComplexType 대신에 int 속성을 매핑하기로 결정했습니다. 나는 또한 int에서 VoteType으로 지속적으로 캐스트해야하는 것을 피하기 위해 (매핑되지 않은) 도우미 속성을 추가했습니다.

나는 여전히 내 문제에 대한 답변을 얻고 싶습니다. 도움을 주시면 감사하겠습니다. 나는 내 자신의 답을 옳은 것으로 표시하기까지 이틀을 기다릴 것이다.

편집 : 나는이 답변을 전혀 얻지 못했기 때문에 내 자신의 답변을 좋은 것으로 표시했습니다.

0

방금 ​​같은 문제가 발생했습니다. 다른 복합 유형을 포함하는 복합 유형이 포함 된 클래스가 있습니다. Class1, Complex1, ChildComplex라고 부르 자. 내 시나리오는 다음과 같습니다 (귀하의 것과 일치하는지 모르지만 오류 메시지는 정확히 동일합니다).

컨텍스트에서 Class1의 인스턴스를 검색하고 Complex1의 속성에서 변경을 수행합니다. 나는 그 상황에 SaveChanges를 호출과 같은 예외를 얻을 :

The entity of type '<Class1>' references the same complex object of type '<Complex2>' more than once. 
Complex objects cannot be referenced multiple times by the same entity. 

내가의 Complex1 인스턴스를 클로닝 Class1의 인스턴스에서 복제 된 버전을 교체하고 변경하기 이외의 괜찮은 해결 방법을 발견하지 않았습니다. 그렇게하면 EF는 그것이 동일한 복합 객체라는 것에 불평하지 않습니다.

정말 이상한 행동입니다. 시간이 있다면 (2038 년경에) 나는 그것을 분리하여 MS에보고하려고하는데, 버그 같은 냄새가 난다.

0

나는이 동일한 문제를 찾고 있었지만 오류를 잘못 읽고 있다는 것을 깨달았습니다. 당신의 엔티티가 같은 타입의 두 개의 프라퍼티를 가지고 있다고 불평하지 않습니다. 두 프라퍼티에 같은 타입의 '정확히 같은'객체를 저장한다는 불평이 있습니다.

필자의 경우 복잡한 형식을 얻기 위해 테이블을 조회하고 있었는데 조회가 동일한 값을 반환하면 동일한 개체가됩니다.

내 복잡한 유형의 새 객체를 만들고 그 값을 조회와 동일하게 설정하여이 문제를 해결했습니다.

관련 문제