为什么控制器脚手架需要一个具有个人用户帐户的项目

Why does controller scaffolding requires a project that has individual user accounts

我试图通过关注 this tutorial 来了解 ASP.NET Core 的工作原理。它正确地指定,如果我想能够利用控制器脚手架的力量,我必须创建一个项目并指定 Authentication as Individual user accounts.

执行此操作时,除其他外,它会生成此 class:ApplicationDbContext : IdentityDbContext<ApplicationUser>。经过几层继承,继承了DbContext.

如果我想使用 DbContext,为什么我必须继承 IdentityDbContext 而不能简单地继承 DbContext

是否可以使用我自己的身份验证结构并仍然能够使用控制器脚手架?

我刚刚试了一下,您可以搭建控制器,但您需要先手动挂接一些东西。 intro to EF Core 可能有助于理解必须如何设置。

  • 从一个新的 MVC 项目开始,select无身份验证因此它不会创建 IdentityContext。
  • 然后将 EF Core 和脚手架所需的依赖项添加到您的 project.json

    "dependencies": {
      ...
      //EF Core
      "Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
      "Microsoft.EntityFrameworkCore.Tools": {
        "version": "1.0.0-preview2-final",
        "type": "build"
      },
      //Scaffolding
      "Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
        "version": "1.0.0-preview2-final",
        "type": "build"
      },
      "Microsoft.VisualStudio.Web.CodeGenerators.Mvc": {
        "version": "1.0.0-preview2-final",
        "type": "build"
      }
    },
    
    "tools": {
      ...
      // EF Core
      "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
      //Scaffolding
      "Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
        "version": "1.0.0-preview2-final",
        "imports": [
          "portable-net45+win8"
        ]
      }
    },
    
  • 创建您要使用的模型class,例如:

    public class Customer
    {
        public int CustomerId { get; set; }
        [Required]
        public string Email { get; set; }        
        public string FirstName { get; set; }
        public string LastName { get; set; }        
    }
    
  • 现在新建一个空的DBContextclass,例如:

    public class FooContext: DbContext
    {
        public FooContext(DbContextOptions<FooContext> options) : base(options)
        {
        }
    }
    
  • 然后用你的上下文更新 Startup.ConfigureServices class:

    services.AddDbContext<FooContext>(options =>
            options.UseSqlServer(Configuration["Data:FooContext:ConnectionString"]));
    
  • 您的 appsettings.json 中还需要一个连接字符串。如果开始一个新项目,你可以使用 localdb 添加一个:

      "Data": {
        "FooContext": {
          "ConnectionString": "Server=(localdb)\mssqllocaldb;Database=FooContext-d69c2d45-f845-4069-92ed-2486567146cb;Trusted_Connection=True;MultipleActiveResultSets=true"
        }
      }
    
  • 使用 localdb 时,您可以通过添加初始迁移和更新数据库来创建数据库。 运行 来自项目根目录的这些命令:

    dotnet ef migrations add initial
    dotnet ef database update
    

确保在这些步骤之后重建项目,然后再使用脚手架选项。

  • 然后您可以右键单击控制器文件夹,select 添加 -> 控制器 并使用 "MVC Controller with Views using Entity Framework" 选项。在你 select 你的模型和上下文 classes 之后,脚手架将为你生成一切。
  • 您还可以避免手动创建 DBContext class 并让脚手架为您生成它。只需 select new DBContext class 在同一个脚手架对话框中,它将创建上下文 class,将连接字符串添加到 appsettings.json并更新 Startup.ConfigureServices。 (您仍然需要创建数据库,例如添加和 运行 初始迁移)

如果您 运行 项目,您将看到您可以导航到生成的索引页面,如 /customers 并看到一个空列表。 不过还有一件事!

  • 脚手架 edit/create 视图依赖于名为 _ValidationScriptsPartial 的部分来添加不显眼的验证脚本,并且由于它在新项目中不存在,edit/create 视图会抛出错误。
  • 您将需要手动创建一个新的局部视图~/Views/Shared/_ValidationScriptsPartial.cshtml,其中包含以下内容:

    <environment names="Development">
        <script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
        <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
    </environment>
    <environment names="Staging,Production">
        <script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.14.0/jquery.validate.min.js"
                asp-fallback-src="~/lib/jquery-validation/dist/jquery.validate.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.validator">
        </script>
        <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/3.2.6/jquery.validate.unobtrusive.min.js"
                asp-fallback-src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive">
        </script>
    </environment>