“参考关系将导致不允许循环引用。”

时间:2013-04-14 17:59:59

标签: entity-framework cyclic-reference

这是方案一,工作正常:

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 个答案:

答案 0 :(得分:1)

要么我使用不同版本的EF(我正在使用5),要么你没有包含导致问题的一些代码。我创建了一个包含您提供的代码的上下文,我得到的唯一错误是关于多个级联路径的错误(通过人员或通过组删除域)。我删除了其中一个关系上的Cascade删除,它运行正常。

这是我的整个上下文类,它没有错误:

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);
    }
}