C# ASP.NET Identity 3.0-如何在MVC应用程序中创建包含用户表的数据库?

C# ASP.NET Identity 3.0-如何在MVC应用程序中创建包含用户表的数据库?,c#,asp.net,entity-framework,asp.net-mvc-5,asp.net-identity-3,C#,Asp.net,Entity Framework,Asp.net Mvc 5,Asp.net Identity 3,我试图从头开始构建一个简单的登录系统,使用ASP.NET MVC v5、Entity Framework v7和Identity v3的代码优先方法。我正在用Visual Studio附带的带有个人用户登录模板的ASP.NET MVC应用程序为我的应用程序建模 我只希望用户创建一个帐户,并将该帐户保存在数据库中 以下是我目前掌握的代码: Startup.cs: 以下是Controllers/AccountController.cs中注册POST操作的代码: [HttpPost] 公共异步任务寄存

我试图从头开始构建一个简单的登录系统,使用ASP.NET MVC v5、Entity Framework v7和Identity v3的代码优先方法。我正在用Visual Studio附带的带有个人用户登录模板的ASP.NET MVC应用程序为我的应用程序建模

我只希望用户创建一个帐户,并将该帐户保存在数据库中

以下是我目前掌握的代码:

Startup.cs:

以下是Controllers/AccountController.cs中注册POST操作的代码:

[HttpPost]
公共异步任务寄存器(RegisterViewModel模型)
{
尝试
{
var user=newapplicationuser{UserName=model.Email};
IdentityResult result=await_userManager.CreateAsync(用户、模型、密码);
控制台写入线(结果);
返回视图(“主视图”、“索引”);
}
捕获(例外情况除外)
{
控制台写入线(ex);
返回视图();
}
}
在这段代码中,
RegisterViewModel
只是一个ViewModel,其中包含Email、Password和ConfirmPassword字段。 Account/Register视图只是一个请求这些字段的表单
ApplicationUser
是从
IdentityUser
扩展而来的类

在POST路由中,我在try块上设置了一个断点,当它进入catch块时,异常显示为“无效对象名AspNetUsers”

在我创建此应用程序中的第一个用户之前,没有数据库。当我注册一个新用户时,应用程序会将我带到一个错误页面,页面上显示“为ApplicationByContext应用现有迁移可能会解决此问题”,并显示一个应用迁移的按钮。当我按下按钮时,数据库被创建。我注意到,当我运行默认的MVC with Users应用程序时,有一个Migrations文件夹,其中包含00000000000000_CreateIdentitySchema.cs和ApplicationDbContextModelSnapshot.cs,看起来它们包含创建数据库所需表的设置。我尝试在我的应用程序中使用这些文件,但没有任何区别

我的问题是:

  • Identity/Entity Framework如何使用表创建数据库 用户信息?我需要“申请”似乎很奇怪 “迁移”,然后才能创建应用程序的数据库

  • 我可以在自己的应用程序中做些什么来让简单的用户登录正常工作?欢迎采用其他方法或框架


EntityFramework在需要时使用连续迁移概念升级数据库架构。默认情况下,初始迁移会创建您已经发现的用户/标识表。您不必直接使用Migrations文件夹中的代码;如果设置了迁移初始化器,则可以在启动时初始化/升级数据库:

我建议您通读本演练,以便更好地了解正在发生的事情以及您可以用它做些什么:


本文介绍了我上面提到的自动初始化/升级场景。

老实说,我在这里写了一篇很长的文章: 通常,您可以使用dotnet cli部署迁移 dotnet ef迁移添加版本2CoolWaves-o数据\迁移

但是请阅读我的完整文章,以获得一步一步的教程

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);
}
"Data": {
  "DefaultConnection": {
    "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=SimpleAuthenticationApp;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}
    [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();
        }
    }