Asp.net core mvc 为什么ControllerScaffolding需要一个具有单独用户帐户的项目

Asp.net core mvc 为什么ControllerScaffolding需要一个具有单独用户帐户的项目,asp.net-core-mvc,asp.net-mvc-scaffolding,Asp.net Core Mvc,Asp.net Mvc Scaffolding,我试图通过以下方式了解ASP.NET核心是如何工作的。它正确地指定,如果我希望能够利用控制器支架的功能,我必须创建一个项目,并将身份验证指定为单个用户帐户 执行此操作时,除其他事项外,它还将生成以下类:ApplicationDbContext:IdentityDbContext。经过几级继承后,它继承了DbContext 如果我想使用DbContext,为什么我必须从IdentityDbContext继承而不能简单地继承DbContext 是否可以使用我自己的身份验证结构,并且仍然能够使用控制器

我试图通过以下方式了解ASP.NET核心是如何工作的。它正确地指定,如果我希望能够利用控制器支架的功能,我必须创建一个项目,并将身份验证指定为单个用户帐户

执行此操作时,除其他事项外,它还将生成以下类:
ApplicationDbContext:IdentityDbContext
。经过几级继承后,它继承了
DbContext

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


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

我只是尝试了一下,您可以脚手架控制器,但首先需要手动挂钩一些东西。在理解事情必须如何设置时,这可能很方便

  • 从一个新的MVC项目开始,选择“无身份验证”,这样它就不会创建IdentityContext
  • 然后将EF Core和scaffolding所需的依赖项添加到您的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"
        ]
      }
    },
    
  • 创建要使用的模型类,例如:

    public class Customer
    {
        public int CustomerId { get; set; }
        [Required]
        public string Email { get; set; }        
        public string FirstName { get; set; }
        public string LastName { get; set; }        
    }
    
    public class FooContext: DbContext
    {
        public FooContext(DbContextOptions<FooContext> options) : base(options)
        {
        }
    }
    
  • 现在创建一个新的空
    DBContext
    类,例如:

    public class Customer
    {
        public int CustomerId { get; set; }
        [Required]
        public string Email { get; set; }        
        public string FirstName { get; set; }
        public string LastName { get; set; }        
    }
    
    public class FooContext: DbContext
    {
        public FooContext(DbContextOptions<FooContext> options) : base(options)
        {
        }
    }
    
  • 在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
    
在使用脚手架选项之前,请确保完成这些步骤后重建项目

  • 然后,您可以右键单击Controllers文件夹,选择Add->Controller并使用“使用实体框架查看MVC控制器”选项。选择模型和上下文类后,脚手架将为您生成所有内容
  • 您还可以避免手动创建DBContext类,让脚手架为您生成它。只需在同一个scaffolding对话框中选择NewDBContext类,它将创建上下文类,将连接字符串添加到appsettings.json并更新
    Startup.ConfigureServices
    。(您仍然需要创建数据库,例如添加并运行初始迁移)
如果运行该项目,您将看到可以导航到生成的索引页面,如
/customers
,并看到一个空列表不过还有一件事

  • 搭建的编辑/创建视图依赖名为\u validationscriptsparial的部分来添加不引人注目的验证脚本,由于它不存在于新项目中,编辑/创建视图将抛出错误
  • 您需要手动创建一个新的局部视图
    ~/Views/Shared/_validationscripttial.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>
    
    
    

感谢您花时间一步一步地解释。不用担心,这是一个有趣的问题!