2016-11-23 3 views
0

私はリンクテーブルでEntityFrameworkを使用しており、 "RolePrivileges"というリンクテーブルを作成するOnModelCreatingを作成しました。しかし、私は、同じデータベースを使用する別のdbcontextを持っていますが、関連して、他の方法は、私はこのエラーを取得する:
Invalid object name 'dbo.PrivilegeRoles'どのリンクテーブルを使用するかをEFに教えるには?

マイ特権クラスはpublic virtual ICollection<Role> Roles { get; set; }性質を持っています。

EFがRolePrivilegesでありPrivilegeRolesではないことをどのように伝えることができますか?

UPDATE

私はいくつかのコード、この大きなプロジェクトを追加していると私は、リポジトリパターンとすべてのことを使用しています。これは単にエラーを表示するだけです

私は多くのプロジェクトを持っていますが、すべてのエンティティ、マイグレーション、およびすべてを持つデータベースを生成するためのものです。

:私はちょうどこの

public class RoleDbContext : DbContext 
{ 
    public RoleDbContext() 
     : base("DefaultConnection") 
    { 
    } 

    public DbSet<Role> AccessRoles { get; set; } 

    public DbSet<Privilege> Privileges { get; set; } 
} 

public class Privilege 
{ 
    public string Id { get; set; } 

    ... 

    [JsonIgnore] 
    [IgnoreDataMember] 
    public virtual ICollection<Role> AccessRoles { get; set; } 
} 

public class Role 
{ 
    public string Id { get; protected set; } 

    public string Name { get; protected set; } 

    public List<Privilege> Privileges { get; set; } = new List<Privilege>(); 
} 

が含まれており、ここで私はエラーを取得する例を示しますdbcontextを持っている別のプロジェクトで

public class EasyhoursDbContext : IdentityDbContext<ApplicationUser> 
{ 
    ... 
    public DbSet<Role> AccessRoles { get; set; } 
    public DbSet<Privilege> Privileges { get; set; } 
    ... 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     ... 
     modelBuilder.Entity<Role>() 
      .HasMany(role => role.Privileges) 
      .WithMany(p => p.AccessRoles) 
      .Map(ap => 
      { 
       ap.MapLeftKey("RoleId"); 
       ap.MapRightKey("PrivilegeId"); 
       ap.ToTable("RolePrivileges"); 
      }); 
     ... 
    } 
} 

public class Role 
{ 
    [Key] 
    public string Id { get; protected set; } 
    public string Name { get; protected set; } 
    public virtual List<Privilege> Privileges { get; private set; } 
} 

public class Privilege 
{ 
    [Key] 
    public string Id { get; set; } 
    ... 
    public virtual ICollection<Role> AccessRoles { get; set; } 
} 

そしてを持って、このプロジェクトではdbcontextで

var db = new RoleDbContext(); 

var role = db.AccessRoles.FirstOrDefault(r => true); 
var privilege = db.Privileges.FirstOrDefault(p => true); 

role.Privileges.Add(privilege); 

db.Entry(role).State = EntityState.Modified; 
db.SaveChanges(); 

変更を保存するとエラーが表示されます。

これと同じコードを実行

enter image description here

が、EasyhoursDbContextに代わり、それは私がEasyhoursDbContextとしてonmodelcreationの正確な同じルールを含むようになりましたRoleDbContextを更新

UPDATE

正常に動作します。

しかし、今、私はこのエラーを取得しています: Violation of PRIMARY KEY constraint 'PK_dbo.RolePrivileges'. Cannot insert duplicate key in object 'dbo.RolePrivileges'. The duplicate key value is (03fd67b6-277f-43f6-b276-5bafbdbe55af, A657a693-0961-Role-b86b-381261aApply).\r\nThe statement has been terminated.

+0

マルチコンテキストの問題にOnModelCreation追加問題の文脈のためにあなたのモデルと流暢なコードを示すことでした。 –

+0

質問を更新しました – Jeggy

+0

'EasyhoursDbContext'のように' RoleDbContext'' OnModelCreating'に流暢な設定を追加してみませんか? –

答えて

0

私はしたいが、問題を見つけることで私を助けるためスティーブ・グリーンに感謝します。

私は必要なすべてはさておき、私のRolesDbContext

modelBuilder.Entity<Role>() 
    .HasMany(role => role.Privileges) 
    .WithMany(p => p.AccessRoles) 
    .Map(ap => 
    { 
     ap.MapLeftKey("RoleId"); 
     ap.MapRightKey("PrivilegeId"); 
     ap.ToTable("RolePrivileges"); 
    }); 
関連する問題