如何使用实体框架访问c#中的多对多映射表
本文关键字:映射 何使用 实体 框架 访问 | 更新日期: 2023-09-27 18:01:12
我首先使用EF代码。我有两个类Users
和Roles
,它们以如下的多对多关系映射。
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指令或程序集引用?(
有人能帮我吗?
您在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);
这一次,只有角色名称会被拉入内存。我认为这也是一个稍微好一点的设计。