2016-10-10 5 views
1

私はカスタムテーブルを作成し、IDを使用しています。このテーブルに行を追加するためのコンテキストもあります。Entity Frameworkの検証エラーを解決するには?

コード

public class UserRoleAccess 
{ 
    [Key] 
    public string Id { get; set; } 

    public string UserRoleId { get; set; } 

    [ForeignKey("Id")] 
    public virtual ApplicationRole ApplicationRole { get; set; } 

    public bool IsActive { get; set; } 

    public string Name { get; set; } 

    public int UserRoleAccessType { get; set; } 
} 

DBコンテキスト:

public class UserRoleAccessContext : DbContext 
{ 
    public UserRoleAccessContext() : base("DMConnection") 
    { 
     Database.SetInitializer<PersonContext>(null); 
     Configuration.LazyLoadingEnabled = false; 
     Configuration.ProxyCreationEnabled = false; 
    } 

    public static UserRoleAccessContext Create() 
    { 
     return new UserRoleAccessContext(); 
    } 

    public DbSet<UserRoleAccess> UserRoleAccess { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     //modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 

     // IMPORTANT: we are mapping the entity User to the same table as the entity ApplicationUser 
     //modelBuilder.Entity<IdentityUserLogin>().ToTable("Users").HasKey(e => e.UserId); 

    } 

    public DbQuery<T> Query<T>() where T : class 
    { 
     return Set<T>(); 
    } 
} 

バインディング

protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 


     modelBuilder.Entity<ApplicationUser>().HasRequired(p => p.Person) 
      .WithMany(b => b.Users); 

     modelBuilder.Entity<ApplicationUser>().HasRequired(p => p.Person) 
      .WithMany(b => b.Users) 
      .HasForeignKey(p => p.PersonId); 

     modelBuilder.Entity<UserRoleAccess>().HasRequired(p => p.ApplicationRole) 
        .WithMany(b => b.UserRoleAccess); 

     modelBuilder.Entity<UserRoleAccess>().HasRequired(p => p.ApplicationRole) 
      .WithMany(b => b.UserRoleAccess) 
      .HasForeignKey(p => p.UserRoleId); 

    } 

public static void CreateUserRoleAccess(string name, int type, string id) 
    { 
     var userAccessContext = new UserRoleAccessContext(); 
     var userRoleAccess = new UserRoleAccess(); 

     userRoleAccess.UserRoleId = id; 
     userRoleAccess.IsActive = true; 

     userRoleAccess.UserRoleAccessType = type; 

     userRoleAccess.Name = name; 

     userAccessContext.UserRoleAccess.Add(userRoleAccess); 
    } 

がエラー

One or more validation errors were detected during model generation:

Project.Models.IdentityUserRole: : EntityType 'IdentityUserRole' has no key defined. Define the key for this EntityType. IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' is based on type 'IdentityUserRole' that has no keys defined.

私はバインディングどこかをしないのですが、私はどこ把握することはできませんと仮定私はエラーを取得する際にこのコードを実行しますか?

編集: UserRoleAccessクラスが変更されました。私は長い間に文字列からIDを変更し、 私はそれが働いたTSQL

INSERT INTO UserRoleAccess (UserRoleId,IsActive, Name, UserRoleAccessType) VALUES('e5b2e76a-a106-4076-b219-6987411995e7', 1, 'TEST', 1) 

でこれを試してみました。イムは、まだ同じエラーを取得しますが、私のアプリケーションからそれを実行している

EDIT 2は が私のバインディングでこれを追加しました:

modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id); 
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId }); 

それでも同じ結果

+0

それはあなたのクラス 'Project.Models.IdentityUserRole'キーが定義されていないと言います。クラス定義を表示できますか? –

+0

これは組み込みのクラスです。https://msdn.microsoft.com/en-us/library/dn613252(v=vs.108).aspx – ThunD3eR

+0

[User in Entity type MVC5 EF6]の可能な複製(http: /stackoverflow.com/questions/19913447/user-in-entity-type-mvc5-ef6) –

答えて

0

とても面白い事があります。

私の2番目の編集は実際には正しいものでした。しかし何らかの理由で、コードを最初にマイグレーションしてdbを更新したときには機能しませんでした。

私はすべてのテーブルを削除し、それらをマイグレーションによって再度作成し、それは動作します。私は両方のデシベルのコンテキストでこのコードを入れていた編集と

ものの:

 modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId); 
     modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id); 
     modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });