【问题标题】:Get Associated Records in a Many-To-Many Relationship using Entity Framework 4.1 Code-First使用 Entity Framework 4.1 Code-First 获取多对多关系中的关联记录
【发布时间】: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


    【解决方案1】:

    在您的多对多映射中,缺少反向导航属性的明确规范。它应该是这样的:

     HasMany(m => m.Positions)
    .WithMany(p => p.Members)   // <- important to specify the navigation property
    .Map(m => m.ToTable("Member_MemberPositions")
               .MapLeftKey("MemberId")
               .MapRightKey("PositionId"));
    

    您的映射将使 EF 在 MemberMemberPosition 之间创建额外的一对多关系。 MemberPosition.Members 是这种关系的一部分,而不是多对多关系。您实际上应该在创建的数据库模式中看到这一点。我希望您的 Member 表中有一个像 MemberPosition_Id 或类似的外键,它属于您不希望拥有的这种一对多关系。如果数据库中的外键是NULL(它应该是一个可为空的列),那么您的职位没有成员。因此,您的第二个查询无法按预期工作,并返回所有职位的空成员集合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多