1

我从以下两个表中创建了一个纯连接表:

用户:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserID { get; set; }
public string UserName { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }

public virtual ICollection<CrRole> Roles { get; set; }

角色:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int RoleID { get; set; }
public String RoleName { get; set; }

public virtual ICollection<CrUser> Users { get; set; }

Fluent API 创建 UserRole 连接表:

    modelBuilder.Entity<CrUser>()
        .HasMany(c => c.Roles)
        .WithMany(i => i.Users)
        .Map(t => t.MapLeftKey("UserID")
            .MapRightKey("RoleID")
            .ToTable("CrUserRole"));

这可以正常工作,并使用 UserID 和 RoleID 列创建正确的 CrUserRole 表。

不过,我在尝试弄清楚如何对此连接表进行简单查询时遇到了很大的困难。在 SQL 中,命令将是:

SELECT COUNT(*) 
FROM UserRole ur
WHERE ur.RoleID = @RoleID
AND   ur.UserID = @UserID

我试过浏览角色或用户实体的导航链接,但似乎总是以一堆拒绝编译的意大利面条代码结束:-(

如果有人能指出我正确的方向,我将不胜感激。甚至一些教程也会有所帮助,我发现的那些似乎只是创建连接表而不包括 CRUD 操作。

谢谢!

4

2 回答 2

2

注意你的映射:

 t.MapLeftKey("UserID")
.MapRightKey("RoleID")
.ToTable("CrUserRole"));

此映射表明您的查询结果将始终为 1 或 0。执行此操作的正确方法 IMO 如下:您同时拥有用户 ID 和角色 ID,对吗?
首先获取用户,然后查询该特定用户的角色。就像是:

var user = ctx.Users.FirstOrDefault(u => u.UserID == myUserId);
var role = user.Roles.FirstOrDefault(r => r.RoleId = myRoleId);
于 2012-12-01T21:29:39.417 回答
1

谢谢凯马尔。

我最终使用的版本是:

String[] returnUsers = new String[1]; 

var role = context.Roles.First(r=>r.RoleName.Equals(roleName)); 

returnUsers = role.Users.Select(s => s.UserName).ToArray(); 

感谢您让我朝着正确的方向前进,并很抱歉花了几个月的时间来更新这个!

于 2013-05-01T15:43:20.427 回答