2011-11-08 18 views
5

こんにちは私は、ユーザーとロールの間の多対多の関係のために自分のエンティティフレームワークを設定しようとしています。エンティティフレームワークのユーザーロール多人数の関係

下の画像はデータベースに何があるかを示しています。

Many to Many relationships

ユーザーのためのモデルは、次のとおりです。役割のため

public class User : IEntity 
    { 
     public virtual int UserId { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(100)] 
     public virtual string UserName { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(100)] 
     public virtual string FirstName { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(100)] 
     public virtual string LastName { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(200)] 
     public virtual string EmailAddress { get; set; } 
     public int AreaId { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(64)] 
     public string CreatedByUserName { get; set; } 
     public DateTime CreatedDateTime { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(64)] 
     public string LastModifiedByUserName { get; set; } 
     public DateTime? LastModifiedDateTime { get; set; } 

     //Navigation properties 
     //public virtual Role Role { get; set; } 
     public virtual Area Area { get; set; } 

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

} 

モデルは次のとおりです。

public class Role : IEntity 
    { 
     public int RoleId { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(100)] 
     public string Name { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(1000)] 
     public string Description { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(64)] 
     public string CreatedByUserName { get; set; } 
     public DateTime CreatedDateTime { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(64)] 
     public string LastModifiedByUserName { get; set; } 
     public DateTime? LastModifiedDateTime { get; set; } 

     //Navigation Properties 
     public ICollection<User> Users { get; set; } 
    } 

のUserRoleは次のとおりです。

私は次のように追加

Server Error in '/' Application. 
Invalid object name 'dbo.RoleUser'. 

public class UserRole 
    { 
     public int UserId { get; set; } 
     public int RoleId { get; set; } 

     //Navigation properties 
     public virtual User User { get; set; } 
     public virtual Role Role { get; set; } 
    } 

は、だから、私は、これは細かい設定していたと思ったが、私のコードでは、私のようなものに行く:

var roles = from r in user.Roles 
         select r.Name; 

をし、それがのエラーを与えて自分自身を撮影します文脈に:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<User>() 
       .HasMany(i => i.Roles) 
       .WithMany(u => u.Users); 

} 

しかし、今私はエラーを受け取ります:

'/'アプリケーションでサーバーエラーが発生しました。 無効な列名 'Role_RoleId'です。 無効な列名 'User_UserId'です。

確かに私はここに何か正しく設定していません。あなたは正しい方向に私を向けることができますか?

答えて

9

リンクテーブルUserRoleをクラスとしてモデル化する必要はありません。テーブルの主キーのみが関係に参加するためです。したがって、UserRoleクラスを削除してください。

既存のデータベースをモデリングする場合、EFはリンクテーブル名をRoleUserと推測することがあります。これを避けるには、次のようにリンクテーブルを設定します。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
     modelBuilder.Entity<User>() 
      .HasMany(i => i.Roles) 
      .WithMany(u => u.Users) 
      .Map(m => 
      { 
       m.ToTable("UserRole"); 
       m.MapLeftKey("UserId"); 
       m.MapRightKey("RoleId"); 
      }); 

} 
+0

RoleエンティティがUserエンティティを認識しない場合はどうですか?設定コードを書くには? –

関連する問題