0

現在、MVC開発者向けのPro Web API 2の本を読んでいます。アダム・フリーマンは、以下に示すように、ユーザー、役割、のUserRole、のUserManagerクラスを作成することにより、ASP.NETアイデンティティフレームワークとプロジェクトを統合:Entity Frameworkはdbo.NetUsers、dbo.NetRoles、dbo.UserRolesテーブルをどのように作成しますか?

public class StoreUser : IdentityUser 
    { 
     // application-specific properties go here 
    } 



public class StoreRole : IdentityRole 
    { 
     public StoreRole() : base() { } 
     public StoreRole(string name) : base(name) { } 
    } 

public class StoreRoleManager : RoleManager<StoreRole> 
    { 
     public StoreRoleManager(RoleStore<StoreRole> store) : base(store) { } 

      public static StoreRoleManager Create(
      IdentityFactoryOptions<StoreRoleManager> options, 
      IOwinContext context) 
     { 
      return new StoreRoleManager(new 
      RoleStore<StoreRole>(context.Get<StoreIdentityDbContext>())); 
     } 
    } 



public class StoreUserManager : UserManager<StoreUser> 
    { 
     public StoreUserManager(IUserStore<StoreUser> store) 
     : base(store) { } 
     public static StoreUserManager Create(
     IdentityFactoryOptions<StoreUserManager> options, 
     IOwinContext context) 
     { 
      StoreIdentityDbContext dbContext = context.Get<StoreIdentityDbContext>(); 
      StoreUserManager manager = 
      new StoreUserManager(new UserStore<StoreUser>(dbContext)); 
      return manager; 
     } 
    } 

そして、著者種子データベースDbContext

public class StoreIdentityDbContext : IdentityDbContext<StoreUser> 
    { 
     public StoreIdentityDbContext() : base("SportsStoreIdentityDb") 
     { 
      Database.SetInitializer<StoreIdentityDbContext>(new 
      StoreIdentityDbInitializer()); 
     } 


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

で初期化子を登録することにより、ここで

public class StoreIdentityDbInitializer : 
    CreateDatabaseIfNotExists<StoreIdentityDbContext> 
    { 
     protected override void Seed(StoreIdentityDbContext context) 
     { 
      StoreUserManager userMgr = 
      new StoreUserManager(new UserStore<StoreUser>(context)); 
      StoreRoleManager roleMgr = 
      new StoreRoleManager(new RoleStore<StoreRole>(context)); 
      string roleName = "Administrators"; 
      string userName = "Admin"; 
      string password = "secret"; 
      string email = "[email protected]"; 
      if (!roleMgr.RoleExists(roleName)) 
      { 
       roleMgr.Create(new StoreRole(roleName)); 
      } 
      StoreUser user = userMgr.FindByName(userName); 
      if (user == null) 
      { 
       userMgr.Create(new StoreUser 
       { 
        UserName = userName, 
        Email = email 
       }, password); 
       user = userMgr.FindByName(userName); 
      } 

     if (!userMgr.IsInRole(user.Id, roleName)) 
      { 
       userMgr.AddToRole(user.Id, roleName); 
      } 
      base.Seed(context); 
     } 
    } 

このパターンでは、アプリケーションが起動するたびにデータベースが作成され、シードされます。しかし、私はこのパターンに従うことを望んでいません。私はdbo.AspNetRoles、dbo.AspNetUsers、dbo.AspNetUserRolesで構成されたデータベースを作成し、それを手動で作成したいと考えています。このため、移行を追加しますが、作成した移行でEntity FrameworkがIDクラスを検出しないため、データベースを移行および更新できません。 この問題を解決するのを手伝ってください。 親切にお礼します

答えて

0

正しく設定されている場合は、最初の移行でIDテーブルが表示されます。

public class StoreIdentityDbContext : IdentityDbContext<StoreUser> 
    { 
     public StoreIdentityDbContext() : base("SportsStoreIdentityDb") 
     { 

     } 

     static StoreIdentityDbContext() 
     { 
      Database.SetInitializer<StoreIdentityDbContext>(null); 
     } 

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

にごStoreIdentityDbContextクラスを変更してみてくださいあなたが同様にMicrosoft.AspNet.Identity.CoreMicrosoft.AspNet.Identity.EntityFrameworkを参照していることを確認します。

それ以外の場合は、デフォルトのASP.NETテンプレートから新しいプロジェクトを作成し、個人用のアカウントを作成します。コードを比較して、欠落しているものを確認することができます。

+0

ありがとうございました。しかし、Entity Frameworkではまだ変更が表示されません。私は、作成されたプロジェクトの認証を選択しませんでした。空のプロジェクトにアイデンティティ・フレームワークを統合します。このプロジェクトは、将来の競合の原因となる移行なしで、起動時にユーザー、ロール、テーブルのデータベースを作成します。 –

関連する問題