2012-03-06 3 views
0

다음과 같은 문제가 있습니다.동일한 클래스/테이블에 대한 2 개의 참조를 가져올 수 없습니다.

데이터베이스를 생성하는 데 코드와 함께 사용할 수없는 클래스가 2 개 있습니다. 이 초기 국가의에

public class Chart 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 
    public State Initial { get; set; } 
    public virtual ICollection<State> States { get; set; } 
} 

public class State 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
} 

은 또한 차트 클래스의 초기 속성을 가리 키도록합니다.

하지만 무엇이든지 시도해도 효과가 없습니다. 나는 데이터 주석, 유창 API 및 외래 속성을 사용했지만 다음과 같은 문제가 계속 발생합니다.

"종속 작업에 대한 유효한 순서를 결정할 수 없습니다. 외래 키 제약 조건, 모델 요구 사항 또는 저장소 요구 사항으로 인해 종속성이 존재할 수 있습니다. 생성 된 값. "

더 많은 interessting 만들기 위해 나는 또한 차트 클래스의 상태 중 하나를 초기 상태 싶습니다.

누군가 나를 도울 수 있습니까?

업데이트 :

코드 첫 프레임 워크는이 개 테이블을 만들려고 :

나는 퍼즐의 조각을 발견했다.
차트 : 열이 -> 이드,
미국을 Initial_Id : 열 -> ID, 이름, 차트 테이블에 미국 테이블 Chart_Id

Chart.Initial_Id 참조 및 State.Chart_Id 참조. 이제 삭제하거나 등을 삽입 계단식 때 이것은 어둠 속에서 바로 기회입니다

흠 ...

+0

다음 해결책을 찾았습니다. 차트를 초기 선택으로 설정합니다. 그런 다음 차트를 저장하고 초기 상태를 설정 한 다음 다시 저장합니다. 못 생겼어, 나도 알아.하지만이 일은 끝내야 해. 레이어가이 추악함을 숨 깁니다. ;-) – Tim

답변

0

... 원형 문제를 소개합니다,하지만 당신은이 사실을 함께 할 수있는 뭔가가 생각 그 두 클래스의 속성 (아마도 기본 키에 대해 원하는 것)에는 id라는 GUID가 있습니까? StateId 및 ChartId로 이름을 바꾸는 것은 어떻습니까? 다른 건 몰라도, 나는 ... 이것은 단지 더 나은 명명 연습이라고 생각

전체 공개 : 나는 CF EF를 사용하지 않는, 그러나 다만 현재

+0

고맙습니다. 제안은 있지만 문제는 아닌 것 같습니다. id 속성은 두 개의 다른 테이블에 대한 열 이름입니다. id 속성은 2 개의 다른 클래스에 대한 속성 일 뿐이므로 나쁜 명명 규칙이라고 생각합니다. 클래스 이름을 속성 이름 앞에두면 특정 클래스의 속성이기 때문에 어떤 값도 추가하지 않습니다. 'name'속성을 StateName으로 변경해도 값이 추가되지 않습니다. 단순히 중복됩니다. – Tim

+0

아마도 이러한 것들이 테이블로 직접 변환되는 경우, 자동 생성 된 쿼리 이외의 컨텍스트에서 참조하는 테이블 일 수 있으므로 ID의 자세한 의미를 볼 수 있어야합니다. (예 : 그래서 so.SomeObjectId = soo.SomeOtherObjectId ON SomeOtherObject 김 가입 SomeObject의 FROM SomeObjectId 를 선택) 죄송 내 생각하지만, 손에 문제를 도움이되지 않았다, 당신은 어디로 가고 내가 볼 – Killnine

+0

). 하지만 그 문제를 해결하기 위해 각 열에 테이블 이름 앞에 접두사를 붙이는 것이 가능하다고 생각합니다. 권리? – Tim

0

EF 흥미로운 게시물로이 가로 질러 수 없습니다 발견 이 맵핑은 갱신/삽입 순서를 판별 할 수없는 순환 종속성과 데이터베이스 생성 키의 조합으로 끝나기 때문에 작성한대로 정확하게 맵핑하십시오.

그러나 줄 사이를 읽으면 상태 엔티티가 여러 차트 항목간에 공유되어 있다고 가정 할 것입니다. 즉, 여러 차트가 동일한 주를 나타낼 수 있습니다.이 경우, 당신이 정말이 것은 차트 및 국가 간 다 대다 관계는, 당신은 대체 할 수 있습니다 OnModelCreating 문맥 EF이에게 :

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Chart>() 
     .HasMany(s => s.States) 
     .WithMany(); 
} 

지금 이런 일이 작동합니다

using (var context = new ChartContext()) 
{ 
    var state1 = new State { Name = "State1" }; 
    var state2 = new State { Name = "State2" }; 

    var chart = 
     new Chart 
     { 
      Initial = state1, 
      States = new List<State> { state1, state2 } 
     }; 

    context.Charts.Add(chart); 
    context.SaveChanges(); 
} 

차트에서 알 수 있듯이 이제 차트에는 초기 상태 및 일련의 상태가 있으며 초기 상태는 상태 집합 중 하나입니다.

실제로 각 상태가 하나의 유일한 차트 엔티티와 연결되어 있다면 다른 것을 알아 내야합니다. 아마도이 해결 방법을 제시 할 수있는 해결 방법이있을 수 있지만 위의 해결책으로는 쉽게 나오지 않습니다. .

관련 문제