为什么控制器脚手架需要一个具有个人用户帐户的项目
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; }
}
现在新建一个空的DBContext
class,例如:
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>
我试图通过关注 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; } }
现在新建一个空的
DBContext
class,例如: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>