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

时间:2016-12-02 22:03:05

标签: asp.net-core-mvc asp.net-mvc-scaffolding

我试图通过关注this tutorial来了解ASP.NET Core的工作原理。它正确地指定,如果我想能够利用控制器脚手架的强大功能,我必须创建一个项目并指定身份验证为个人用户帐户

执行此操作时,除了其他内容之外,它还会生成此类:ApplicationDbContext : IdentityDbContext<ApplicationUser>。在几个继承级别之后,它继承DbContext

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

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

1 个答案:

答案 0 :(得分:2)

我只是尝试了一下你可以将控制器搭建起来,但你需要先手动勾选一些东西。 intro to EF Core在理解必须如何设置方面可能会派上用场。

  • 从新的MVC项目开始,选择 No Authentication ,这样就不会创建IdentityContext。
  • 然后将 project.json 添加到EF Core和scaffolding所需的依赖项中:

    "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; }        
    }
    
  • 现在创建一个新的空DBContext类,例如:

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

    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
    

在使用脚手架选项之前,请确保在执行这些步骤后重建项目

  • 然后,您可以右键单击Controllers文件夹,选择 Add - &gt;控制器并使用“MVC Controller with Views using Entity Framework”选项。选择模型和上下文类后,脚手架将为您生成所有内容。
  • 您还可以避免手动创建DBContext类,并让scaffolding为您生成它。只需在同一个脚手架对话框中选择 new DBContext class ,它就会创建上下文类,将连接字符串添加到appsettings.json并更新Startup.ConfigureServices。 (您仍然需要创建数据库,例如添加并运行初始迁移)

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

  • scaffolded编辑/创建视图依赖于部分命名的 _ValidationScriptsPartial 来添加不显眼的验证脚本,并且因为它在新项目中不存在,编辑/创建视图将引发错误
  • 您需要手动创建一个包含以下内容的新部分视图~/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>