【问题标题】:Asp.Net LINQ to combine three tablesAsp.Net LINQ 组合三个表
【发布时间】:2016-07-09 18:31:43
【问题描述】:

我想在我的视图中显示三列:

======================================
UserName      | Email    | Role Name
======================================    
codelover12     code@g.g    Student    
kimmy45634      kimy@c.c    Teacher    
======================================

所以一开始我的想法是这样的

我可以在AspNetUsers 表中加入IdUserIdAspNetUserRoles 表中,也可以在AspNetRoles 中加入Id,这样我就可以弄清楚谁担任哪个角色。

我是这样尝试的:

var model = from users in db.Users
            join userRoles in db.AspNetUserRoles on users.Id equals roles.UserId
            join role in db.Roles on role.Id equals userRoles.RoleId 
            select new { users.UserName, users.Email, role.Name };

但发现我无法访问 AspNetUserRoles。 非常感谢您的帮助。

【问题讨论】:

  • “无法访问 AspNetUserRoles”具体是什么意思?您的查询是否给您一个错误?至少它应该是user.Id equals userRoles.UserId,尽管您应该考虑改用导航属性。
  • 它在 db.AspNetUserRoles 上给我一个错误,说 ApplicationDbContext 不包含“AspNetUserRoles”的定义
  • 我猜这是多对多表,EF 不会为这些表创建实体。相反,您应该使用导航属性。类似from user in db.Users from role in user.Roles

标签: c# mysql asp.net .net linq


【解决方案1】:

好吧,我想通了。

最简单的方法是将这行代码添加到 IdentityModels.cs

public DbSet<IdentityUserRole> UserRoles { get; set; }

那么您现在可以访问 AspNetUserRoles,并编写类似的代码

var findRole = (from userRole in db.UserRoles
                join role in db.Roles on
                userRole.RoleId equals role.Id
                where userRole.UserId == Id
                select role.Name).ToList();

希望这可以帮助其他有类似问题的人。

【讨论】:

    【解决方案2】:

    EF 自动创建交叉表 AspNetUserRoles。因此,您可以使用导航属性或这样做:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {    
        modelBuilder.Entity<AspNetUser>()
            .HasMany(x => x.Roles)
            .WithMany(x => x.AspNetUsers)
        .Map(x =>
        {
            x.ToTable("AspNetUserRoles"); // third table is named Cookbooks
            x.MapLeftKey("AspNetUserId");
            x.MapRightKey("RoleId");
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      相关资源
      最近更新 更多