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

我究竟做错了什么?!我想要达到的目的是完全合理的

4

1 回答 1

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);
    }
}
于 2013-04-14T18:52:55.517 回答