2013-04-14 5 views
0

이 잘 작동 시나리오 하나입니다 :"참조 관계로 인해 순환 참조가 허용되지 않습니다."

public class Domain 
{ 
    public int DomainId { get; set; } 

    [InverseProperty("Domain")] 
    public virtual ICollection<Person> Persons { get; set; } 

    [InverseProperty("Domain")] 
    public virtual ICollection<Group> Groups { get; set; } 
} 

public class Person 
{ 
    public int PersonId { get; set; } 
    public virtual Domain Domain { get; set; } 
    public virtual ICollection<Group> Groups { get; set; } 
} 

public class Group 
{ 
    public int GroupId { get; set; } 
    public virtual Domain Domain { get; set; } 
    public virtual ICollection<Person> Members { get; set; } 
} 

을 그리고이 시나리오이 실패합니다. 은 참조 관계가 허용되지 않는 순환 참조 될 것이다 :

public class Domain 
{ 
    // Same as scenario 1... 
} 

public class Person 
{ 
    public int PersonId { get; set; } 
    public int DomainId { get; set; }    // <--- new 
    [ForeignKey("DomainId")]      // <--- new 
    public virtual Domain Domain { get; set; } 
    public virtual ICollection<Group> Groups { get; set; } 
} 

public class Group 
{ 
    public int GroupId { get; set; } 
    public int DomainId { get; set; }    // <--- new 
    [ForeignKey("DomainId")]      // <--- new 
    public virtual Domain Domain { get; set; } 
    public virtual ICollection<Person> Members { get; set; } 
} 

시나리오 2에 오류 메시지는 다음과 같다. [제약 조건 이름 = FK_dbo.GroupMembers_dbo.Persons_MemberId]

두 시나리오 모두 OnModelCreating의 메서드 내에서이 매핑 (여러 대 다수)을 사용합니다.

 modelBuilder.Entity<Group>() 
      .HasMany(group => group.Members) 
      .WithMany(member => member.Groups) 
      .Map(m => 
      { 
       m.ToTable("GroupMembers"); 
       m.MapLeftKey("GroupId"); 
       m.MapRightKey("MemberId"); 
      }); 

내가 뭘 잘못하고 있니?! 내가 성취하고자하는 것이 완전히 합리적입니다.

답변

1

나에게 다른 버전의 EF를 사용하고 있거나 (나는 5를 사용하고 있습니다.) 문제를 일으키는 코드를 포함하고 있지 않습니다. 내가 제공 한 코드가 포함 된 컨텍스트를 만들었고 오류가 발생한 것은 여러 개의 계단식 경로 (도메인은 사람 또는 그룹을 통해 삭제됨)에 대한 오류였습니다. 관계 중 하나에서 캐스케이드 삭제를 제거했는데 정상적으로 작동합니다.

다음은 오류없이 작동 내 전체 문맥 클래스이다 : 나는 파악하지 못할

public class TestContext : DbContext 
{ 
    public DbSet<Person> People { get; set; } 

    public DbSet<Group> Groups { get; set; } 

    public DbSet<Domain> Domains { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Group>() 
      .HasMany(group => group.Members) 
      .WithMany(member => member.Groups) 
      .Map(m => 
      { 
       m.ToTable("GroupMembers"); 
       m.MapLeftKey("GroupId"); 
       m.MapRightKey("MemberId"); 
      }); 

     modelBuilder.Entity<Domain>() 
      .HasMany(d => d.Groups).WithRequired(g => g.Domain) 
      .WillCascadeOnDelete(false); 
    } 
} 
+0

젠장 무엇 – sports

+0

일어나고 당신이 EF 4.4에 시도하는 것이 가능은? Visual Studio 2010과 함께 5로 업그레이드 할 수없는 것 같습니다 – sports

+0

더 이상 VS2010이 없습니다. VS 버전은 중요하지 않습니다 - 당신은'Update-Package EntityFramework'를 nuget 패키지 관리자 콘솔에서 시도 했습니까? – Richard