【发布时间】:2012-01-22 19:48:22
【问题描述】:
我使用的是 Entity Framework 4.1 代码优先,但在检索多对多关系中的关联记录时遇到了一点问题。我有一个主要的 Member 实体,然后它有一个关联的 MemberStatus (一对多关系)和一个关联的 MemberPosition (多对-许多关系)。
对于管理控制台,我正在检索 MemberStatuses 或 MemberPositions 列表,但我需要知道是否有分配给这些值的成员,以便确定是否可以删除该值。
我在管理控制台中使用了以下代码:
var statusList = MemberStatusRepository.AllIncluding(x => x.Members).ToList(); // This works...
var positionList = MemberPositionRepository.AllIncluding(x => x.Members).ToList(); // This doesn't...
statusList 值按预期返回,并且状态集合包括分配了多少成员的计数。但是,postionList 会返回适当的列表,但当我知道分配了成员时,每个位置的成员集合显示计数为 0。
奇怪的是我能够获得每个成员的职位列表,所以我相信我的 MemberMap 中的映射是正确的。我只是无法得到相反的结果,即每个职位的成员列表。此外,EF 创建的数据库看起来是正确的,具有正确的架构,用于成员与职位的多对多关系。
以下是我的实体和 EF 映射代码(继承自 EntityTypeConfiguration)。我在 MemberPosition 地图上遗漏了什么,所以当我调用上面的代码时,每个位置都会返回一个成员列表?
public class Member : Entity
{
public string Email { get; set; }
public int StatusId { get; set; }
public virtual MemberStatus Status { get; set; }
public virtual List<MemberPosition> Positions { get; set; }
}
public class MemberStatus : Entity
{
public string Name { get; set; }
public ICollection<Member> Members { get; set; }
}
public class MemberPosition : Entity
{
public string Name { get; set; }
public ICollection<Member> Members { get; set; }
}
public MemberMap()
{
ToTable("Members");
Property(m => m.Email).IsRequired().HasMaxLength(255);
HasMany(m => m.Positions).WithMany() .Map(m => m.ToTable("Member_MemberPositions").MapLeftKey("MemberId").MapRightKey("PositionId"));
HasRequired(m => m.Status).WithMany(s => s.Members).WillCascadeOnDelete(false);
}
public MemberStatusMap()
{
ToTable("MemberStatuses");
}
public MemberPositionMap()
{
ToTable("MemberPositions");
HasMany(p => p.Members).WithMany();
}
【问题讨论】:
标签: entity-framework many-to-many ef-code-first