1

ASP.NET MVC v5、Entity Framework v7、および Identity v3 でコード ファーストのアプローチを使用して、単純なログイン システムをゼロから構築しようとしています。Visual Studio に付属している個々のユーザー ログイン テンプレートを使用して、ASP.NET MVC アプリの後に自分のアプリをモデル化しています。

私が望むのは、ユーザーがアカウントを作成し、そのアカウントがデータベースに保存されることだけです。

これが私がこれまでに持っているコードです:

Startup.cs :

public class Startup
{
    public IConfigurationRoot Configuration { get; set; }
    public Startup()
    {
        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json");
        builder.AddEnvironmentVariables();
        Configuration = builder.Build();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());
        app.UseStaticFiles();
        app.UseIdentity();
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

    public static void Main(string[] args) => WebApplication.Run<Startup>(args);
}

appsettings.jsonには、データベースに接続するための次のコードが含まれています。

"Data": {
  "DefaultConnection": {
    "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=SimpleAuthenticationApp;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Controllers/AccountController.csの Register POST アクションのコードは次のとおりです。

    [HttpPost]
    public async Task<IActionResult> Register (RegisterViewModel model)
    {
        try
        {
            var user = new ApplicationUser { UserName = model.Email };
            IdentityResult result = await _userManager.CreateAsync(user, model.Password);
            Console.WriteLine(result);
            return View("Home", "Index");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            return View();
        }
    }

このコードでRegisterViewModelは、Email、Password、および ConfirmPassword のフィールドを持つ単なる ViewModel です。Account/Registerビューは、これらのフィールドを要求する単なるフォームです。ApplicationUserから拡張されたクラスですIdentityUser

POST ルートで、try ブロックにブレーク ポイントを設定し、catch ブロックに入ると、「無効なオブジェクト名 AspNetUsers」という例外が表示されます。

このアプリで最初のユーザーを作成する前は、データベースがありません。新しいユーザーを登録すると、アプリによって、「ApplicationDbContext の既存の移行を適用すると、この問題が解決する可能性があります」というエラー ページが表示され、移行を適用するボタンが表示されます。ボタンを押すと、データベースが作成されます。ユーザー アプリで既定の MVC を実行すると、00000000000000_CreateIdentitySchema.csApplicationDbContextModelSnapshot.csを含むMigrationsフォルダーがあり、必要なテーブルを含むデータベースを作成するための設定が含まれているように見えます。アプリでこれらのファイルを使用してみましたが、違いはありませんでした。

私の質問:

  • Identity/Entity Framework は、ユーザー情報のテーブルを含むデータベースをどのように作成しますか? アプリのデータベースを作成する前に「移行を適用」する必要があるのは奇妙に思えます。

  • 自分のアプリで簡単なユーザー ログインを機能させるにはどうすればよいですか? 他のアプローチやフレームワークは大歓迎です。

4

2 に答える 2

2

EntityFramework は、継続的な移行の概念を使用して、必要に応じてデータベース スキーマをアップグレードします。デフォルトでは、最初の移行により、すでに発見したようにユーザー/ID テーブルが作成されます。Migrations フォルダー内のコードを直接操作する必要はありません。移行初期化子を設定すると、起動時にデータベースを初期化/アップグレードできます。

何が起こっているのか、何ができるのかをよりよく理解するために、このウォークスルーを読むことをお勧めします。

https://msdn.microsoft.com/en-us/data/jj591621.aspx

上記の自動初期化/アップグレード シナリオについては、この記事で説明します。

于 2015-12-27T02:53:55.693 に答える