是否可以使用实体框架直接引用多对多表,代码优先

Eri*_*ric 15 many-to-many ef-code-first entity-framework-4.1

我正在使用实体框架并建模多对多关系.

我使用流畅的API创建了两个实体之间的关系(假设用户和组):

this.HasMany(t => t.Users)
.WithMany(t => t.Groups)
.Map(
m =>
{
  m.ToTable("GroupMembers");
  m.MapLeftKey("Group_Id");
  m.MapRightKey("User_Id");
});
Run Code Online (Sandbox Code Playgroud)

这很好用,但我也希望能够直接引用GroupMembers表.要做到这一点,我有类似的东西:

[Table("GroupMembers")]
public class GroupMember
{
    #region Properties

    /// <summary>
    /// Gets or sets the group.
    /// </summary>
    public virtual Group Group { get; set; }

    /// <summary>
    /// Gets or sets the Id of rht group.
    /// </summary>
    [Key]
    [Column("Group_Id", Order = 1)]
    public int GroupId { get; set; }

    /// <summary>
    /// Gets or sets the user.
    /// </summary>
    public virtual User User { get; set; }

    /// <summary>
    /// Gets or sets the Id of the user.
    /// </summary>
    [Key]
    [Column("User_Id", Order = 2)]
    public int UserId { get; set; }

    #endregion
}    
Run Code Online (Sandbox Code Playgroud)

但是,在初始化DbContext期间,我将收到以下错误:

指定的架构无效.错误:(381,6):错误0019:已定义具有架构"dbo"和表"GroupMembers"的EntitySet"GroupUser".每个EntitySet必须引用唯一的模式和表.

我相信这是因为实体框架没有意识到在流畅的API和GroupMembers实体表中指定的GroupMembers表实际上是同一个.换句话说,如果我删除描述多对多关系的流畅API代码,那么我就能成功初始化DbContext.

我可以拥有一个多对多的表格,我也可以直接参考吗?

Sla*_*uma 12

不,你不能.如果您希望通过单独的实体访问连接表,则必须通过两个一对多关系替换多对多关系,并更改导航属性UserGroup引用GroupMember:

public class Group
{
    public int GroupId { get; set; }
    public virtual ICollection<GroupMember> Members { get; set; }
}

public class User
{
    public int UserId { get; set; }
    public virtual ICollection<GroupMember> Members { get; set; }
}

modelBuilder.Entity<Group>()
    .HasMany(g => g.Members)
    .WithRequired(gm => gm.Group);

modelBuilder.Entity<User>()
    .HasMany(u => u.Members)
    .WithRequired(gm => gm.User);
Run Code Online (Sandbox Code Playgroud)

你为什么想要这个GroupMember实体?它不包含任何商业含义,只有引用和键.通常,您可以通过编写LINQ查询以及使用GroupUserDbSets /实体及其导航属性来获取和修改连接表的任何内容.

  • "不,你不能",哦,男孩,我希望我在9个小时前找到了这个答案. (2认同)