2013-04-14 68 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試試?看來,我不能升級到5與Visual Studio 2010 – sports

+0

我沒有VS2010了。 VS版本應該不重要 - 你有沒有試過Nuget包管理器控制檯中的Update-Package EntityFramework? – Richard