1

次の2つのテーブルから純粋な結合テーブルを作成しました。

ユーザー:

[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; }

UserRole結合テーブルを作成するためのFluentAPI:

    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

RoleエンティティまたはUserエンティティのいずれかのナビゲーションリンクを試しましたが、コンパイルを拒否するスパゲッティコードが大量に発生するようです:-(

誰かが私を正しい方向に向けてくれたらとてもありがたいです。いくつかのチュートリアルでも役に立ちますが、私が見つけたチュートリアルは、結合テーブルの作成までしか進んでおらず、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 に答える