如何使用实体框架访问c#中的多对多映射表

本文关键字:映射 何使用 实体 框架 访问 | 更新日期: 2023-09-27 18:01:12

我首先使用EF代码。我有两个类UsersRoles,它们以如下的多对多关系映射。

public class User
{
    public User()
    {
        this.Roles = new HashSet<Role>();
    }
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string PasswordHash { get; set; }
    public DateTime? LastLoggedOn { get; set; }
    public DateTime? PasswordChangedOn { get; set; }
    public int IsActive { get; set; }
    public virtual ICollection<Role> Roles { get; set; }
}
public class Role
{
    public Role()
    {
        this.Users = new HashSet<User>();
    }
    public int RoleId { get; set; }
    public string RoleName { get; set; }
    public string Description { get; set; }
    public virtual ICollection<User> Users { get; set; }
}
public class UserMap : EntityTypeConfiguration<User>
{
    public UserMap()
    {
        HasMany(r => r.Roles).WithMany(u=>u.Users)
            .Map(m =>
            {
                m.ToTable("UserRoles");
                m.MapLeftKey("UserId");
                m.MapRightKey("RoleId");
            });
    }
}

现在我想从Roles获取RoleName,并分别从Users 获取UserId

我使用的是这个代码:

var roleName = db.Users.Join(db.UserRoles, u => u.UserId, r => r.UserId, (u, r) => new { u, r })
                       .Join(db.Roles, ur => ur.r.RoleId, q => q.RoleId, (ur, q) => new { ur, q })
                       .Where(m => m.ur.r.UserId == 1)
                       .Select(m => new { m.ur.r.UserId, m.q.RoleName });

但它不允许我使用UserRoles

错误

"Context"不包含"UserRoles"的定义,也找不到接受"Context"类型的第一个参数的扩展方法"UserRole"(是否缺少using指令或程序集引用?(

有人能帮我吗?

如何使用实体框架访问c#中的多对多映射表

您在fluent API中定义的表的名称将仅由数据库使用(并且已知(。从您的应用程序中,您应该通过以下操作进行查询:

db.Users.Find(userId).SelectMany(x=>x.Roles).SelectMany(x=>x.RoleName)

请注意,这将从内存中的用户加载所有角色,但这很好,因为我想一个用户永远不会有1000个角色。

除此之外,我认为角色和用户之间应该只有1比1的关系。我建议在角色类中添加UserId列,并从该类中删除Users集合。

这样,您的查询将简单地为:

db.Roles.Where( x => x.UserId = userId).Select( x => x.RoleName);

这一次,只有角色名称会被拉入内存。我认为这也是一个稍微好一点的设计。