2016-10-13 7 views
2

私がしようとしているのは、新しい管理者ユーザーを追加して管理者ロールに割り当てることです。 ..だから私はConfigure方法でStartup.csクラスに行って、次のコードを書いた:UserManagerクラスを取得できません

重大度コード説明プロジェクトファイルの行の抑制状態 :しかし、私は次のエラーメッセージが表示されます

var context = app.ApplicationServices.GetService<ApplicationDbContext>(); 

// Getting required parameters in order to get the user manager 
var userStore = new UserStore<ApplicationUser>(context); 

// Finally! get the user manager! 
var userManager = new UserManager<ApplicationUser>(userStore); 

をエラーCS7036 の必要な仮パラメータ 'optionsAccessor' of に対応する引数はありません。UserManager.UserManager(IUserStore、 IOptions、IPasswordHasher、 IEnumera 、> BLE のIEnumerable>、ILookupNormalizer、 IdentityErrorDescriber、IServiceProvider、 ILoggerです>「)FinalProject..NETCoreApp、バージョン= v1.0ののC:\ Visual Studioの\ Users \ユーザーまたは ナタン\ドキュメント 2015プロジェクト\ FinalProject \ SRC \ \ FinalProject \ Startup.cs 101 Active

このエラーはここで私を殺しています。明らかに私は新しいユーザーを作成するためにuserManagerが必要ですが、私はこのことを初期化できません。

+0

public static class ApplicationDbContextExtensions { public static void EnsureSeedData(this ApplicationDbContext context, UserManager<ApplicationUser> userManager) { if (!context.Users.Any()) { var result = userManager.CreateAsync( new ApplicationUser { UserName = "[email protected]", Email = "[email protected]" }, "[email protected]").Result; } } } 

StartupクラスとConfigure方法で:最初のデータベースをシードするために、次のように拡張メソッドを作成しますそれはUserStoreと一緒です。 GoogleのEF Coreでデータをシードする方法については、音楽ストアアプリなどを参照してください。私のプロジェクトでは、IDユーザーとロールとクレームを管理するためのUIを提供し、スタートアップ時にサイトの管理ユーザーを自動作成します。https:// github。 com/joeaudette/cloudscribe –

答えて

4

dependency injectionを使用すると、UserManagerのインスタンスを取得できます。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, ApplicationDbContext context, UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager) 

次に、ユーザーと役割を作成することができます。私は通常...静的クラスにこのコードを移動

public static class DbInitializer 
{ 
    public static async Task Initialize(ApplicationDbContext context, UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager) 
    { 
     // Ensure that the database exists and all pending migrations are applied. 
     context.Database.Migrate(); 

     // Create roles 
     string[] roles = new string[] { "UserManager", "StaffManager" }; 
     foreach (string role in roles) 
     { 
      if (!await roleManager.RoleExistsAsync(role)) 
      { 
       await roleManager.CreateAsync(new IdentityRole(role)); 
      } 
     } 

     // Create admin user 
     if (!context.Users.Any()) 
     { 
      await userManager.CreateAsync(new ApplicationUser() { UserName = "[email protected]", Email = "[email protected]" }, "[email protected]"); 
     } 

     // Ensure admin privileges 
     ApplicationUser admin = await userManager.FindByEmailAsync("[email protected]"); 
     foreach (string role in roles) 
     { 
      await userManager.AddToRoleAsync(admin, role); 
     } 
    } 
} 

...とStartup.Configure方法でメソッドを呼び出す:Entity Frameworkのコアの次のリリースの一つで

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, ApplicationDbContext context, UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager) 
{ 
    // Code omitted for brevity 

    // Create seed data 
    DbInitializer.Initialize(context, userManager, roleManager).Wait(); 
} 

database seeding will be added as a feature

+0

ありがとうございました。結局私はそれを行う別の方法を見つけました: –

+0

//アプリケーションのdbコンテキストを取得します。 var context = app.ApplicationServices.GetService (); //ユーザーマネージャを取得 var userManager = app.ApplicationServices.GetService >(); //ロールマネージャーを取得 var roleManager = app.ApplicationServices。GetService >(); appパラメータを使用して、必要なサービスを取得するだけで済みます。 –

0

@JuliusHardtは、従属性注入によってUserManagerのインスタンスを取得できると述べています。一般的に、人々はDBContextと直接それを行う、または多分あなたができるスタートアップからデータをシードする

if (env.IsDevelopment()) 
{ 
    app.UseDeveloperExceptionPage(); 
    app.UseDatabaseErrorPage(); 
    app.UseBrowserLink(); 
    using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope()) 
    { 
     // First apply pendding migrations if exist 
     serviceScope.ServiceProvider.GetService<ApplicationDbContext>().Database.Migrate(); 

     // Then call seeder method 
     var userManager = serviceScope.ServiceProvider.GetService<UserManager<ApplicationUser>>(); 
     serviceScope.ServiceProvider.GetService<ApplicationDbContext>().EnsureSeedData(userManager); 
    } 
} 
関連する問題