【问题标题】:Entity Framework - A one-to-many relationship returns an incorrect number of records实体框架 - 一对多关系返回不正确的记录数
【发布时间】:2020-10-11 16:25:18
【问题描述】:

“用户”实体与“组成员”实体具有一对多关系。

public class User
{
    #region Public properties
    [Key]
    [Column("id")]
    public int Id { get; set; }
    ...
    public virtual ICollection<GroupMember> GroupMembers { get; set; }

    public virtual ICollection<Profile> Profiles { get; set; }
    #endregion
}
public class GroupMember
{
    #region Public properties
    [Required]
    [Column("groupid")]
    public int GroupId { get; set; }

    public virtual Group Group { get; set; }

    [Required]
    [Column("userid")]
    public int UserId { get; set; }

    public virtual User User { get; set; }

    [Required]
    [Column("lu_user")]
    public int LuUser { get; set; }

    [Required]
    [Column("lu_date")]
    public DateTime LuDate { get; set; }
    #endregion
}

在UserDbContext类中,我设置关系如下:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<GroupMember>()
        .HasKey(x => x.UserId);

    modelBuilder.Entity<GroupMember>()
        .HasOne(x => x.User)
        .WithMany(x => x.GroupMembers)
        .HasForeignKey(x => x.UserId);
}

执行查询时:

var user = _dbContext.Users
                .Include(u => u.Profiles)
                .Include(u => u.GroupMembers)
                    .ThenInclude(gm => gm.Group)
                .Where(u => u.Id == id)
                .Select(u => u)
                .SingleOrDefault();

“GroupMembers”字段应包含七条记录。查询结果为“GroupMembers”字段的一条记录。

我不明白为什么我没有得到正确的关系记录数。

【问题讨论】:

    标签: .net entity-framework entity-framework-core


    【解决方案1】:

    有了这个流畅的 API

    modelBuilder.Entity<GroupMember>()
        .HasKey(x => x.UserId);
    

    您告诉 EF GroupMember 表的 UserId 列是唯一的,从而使关系有效地一对一。这就是为什么每个用户只能获得一条记录,即使您有集合导航属性。

    由于GroupMember 实体看起来像在多对多关系中使用的连接实体(我们知道可以将其视为多对多关系),因此它很可能需要像这样的复合主键

    modelBuilder.Entity<GroupMember>()
        .HasKey(x => new { x.GroupId, x.UserId });
    

    如果您要映射到现有数据库,这应该足够了(因为您期望查询中有多个记录,因此您知道该表存在并且每个用户包含多个记录,如果 UserId 是独一无二)。

    但如果您在迁移中使用代码优先方法,请确保在进行上述更改后创建并应用新迁移。

    【讨论】:

    • 非常感谢您帮助我理解问题。
    【解决方案2】:

    请不要自己创建/设置 DBContext。请务必使用 Scaffold-Dbcontext 命令为您自动生成 DBContext。

    Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 2017-06-27
      相关资源
      最近更新 更多