这是方案一,工作正常:
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");
});
我做错了什么?!我想要实现的是完全合理的
答案 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);
}
}