Scaffolding ASP.Net Core MVC





3.00/5 (7投票s)
在本文中,我们将探讨如何借助 Entityframework Core 命令行工具,基于现有数据库(数据库优先)创建模型,然后学习如何使用 Scaffolding(接口和代码生成器命令)基于模型生成控制器和视图。
以下是主题
- 管理程序包
- EF Core 模型(数据库优先)
- MVC Core Scaffolding
创建新项目:文件 > 新建 > 项目
从左侧菜单中选择 .Net Core > ASP.Net Core Web Application
选择 ASP.Net Core 示例模板,然后单击“确定”。
使用 SSMS 创建一个名为“PhoneBook”的新数据库。复制以下查询并在 SSMS 的查询编辑器中运行它。
USE [PhoneBook] GO /****** Object: Table [dbo].[Contacts] Script Date: 12/9/2016 2:47:49 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Contacts]( [ContactID] [int] IDENTITY(1,1) NOT NULL, [FirstName] [nvarchar](50) NULL, [LastName] [nvarchar](50) NULL, [Phone] [nvarchar](50) NULL, [Email] [nvarchar](50) NULL, CONSTRAINT [PK_Contacts] PRIMARY KEY CLUSTERED ( [ContactID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
Entity Framework Core
Entity Framework (EF) Core 是一种面向跨平台的访问技术。打开 project.json 文件,在 Dependency 和 Tools 部分添加以下程序包。
添加依赖项程序包
//Database Provider for EF Core "Microsoft.EntityFrameworkCore.SqlServer": "1.0.1", //EF Core Package Manager Console Tools "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final", //EF Core Funtionality for MSSQL Server "Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.1"
添加工具
//Access Command Tools EF Core "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
EntityFrameworkCore.SqlServer:数据库提供程序,允许 Entity Framework Core 与 Microsoft SQL Server 一起使用。EntityFrameworkCore.SqlServer.Design:设计时工具,允许 Entity Framework Core 功能(EF Core 迁移)与 Microsoft SQL Server 一起使用。EntityFrameworkCore.Tools: 命令行工具,用于 EF Core,包含各种命令。
适用于程序包管理器控制台
- Scaffold-DbContext
- Add-Migration
- Update-Database
适用于命令窗口
- dotnet ef dbcontext scaffold
使用命令行在我们的示例应用程序中,我们将使用命令行应用命令。
转到项目目录 > 按住 Shift 键并右键单击以打开命令窗口。
命令: dotnet ef dbcontext scaffold "Server=DESKTOP-5B67SHH;Database=PhoneBook;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer --output-dir Models
从解决方案资源管理器可以看到,已创建包含 Context 和 Entities 的 Models 文件夹。
生成的 DbContext:最终生成的 Context 类的完整视图。
public partial class PhoneBookContext : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { #warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings. optionsBuilder.UseSqlServer(@"Server=DESKTOP-5B67SHH;Database=PhoneBook;Trusted_Connection=True;"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Contacts>(entity => { entity.HasKey(e => e.ContactId) .HasName("PK_Contacts"); entity.Property(e => e.ContactId).HasColumnName("ContactID"); entity.Property(e => e.Email).HasMaxLength(50); entity.Property(e => e.FirstName).HasMaxLength(50); entity.Property(e => e.LastName).HasMaxLength(50); entity.Property(e => e.Phone).HasMaxLength(50); }); } public virtual DbSet<Contacts> Contacts { get; set; } }
ASP.Net MVC Core Scaffolding
我们在早期版本的 .Net 中使用过 scaffolding,由于 .Net Core 是新的,有时会混淆如何开始,在这里我们将探讨这些问题。打开 project.json 文件,在 Dependency 和 Tools 部分添加以下程序包。添加依赖项程序包:
//Code Generators Package Generate Controller,Views "Microsoft.VisualStudio.Web.CodeGenerators.Mvc": "1.0.0-preview2-final", "Microsoft.VisualStudio.Web.CodeGeneration.Tools": "1.0.0-preview2-final"
添加工具
//Access Command Tools Code Generation "Microsoft.VisualStudio.Web.CodeGeneration.Tools": "1.0.0-preview2-final"
单击“保存”,程序包将自动还原。程序包已安装到我们的应用程序中,我们可以进行下一个步骤——Scaffolding 控制器和视图。
使用接口进行 Scaffolding:右键单击 Controller 文件夹 > 添加 > 新建 Scaffolding 项
选择代码生成方式的 scaffolding 选项。
现在,提供将用于与数据库交互的模型和上下文类,选择视图选项,然后单击“添加”按钮执行操作。
稍等片刻,从解决方案资源管理器可以看到视图已生成。
输出消息如下所示。
C:\Program Files\dotnet\dotnet.exe aspnet-codegenerator --project "E:\Documents\Article\ScaffoldingCoreMVC\CoreMVCScaffolding\src\CoreMVCScaffolding" controller --force --controllerName ContactsController --model CoreMVCScaffolding.Models.Contacts --dataContext CoreMVCScaffolding.Models.PhoneBookContext --relativeFolderPath Controllers --controllerNamespace CoreMVCScaffolding.Controllers --useDefaultLayout Finding the generator 'controller'... Running the generator 'controller'... Attempting to compile the application in memory Attempting to figure out the EntityFramework metadata for the model and DbContext: Contacts Added Controller : \Controllers\ContactsController.cs Added View : \Views\Contacts\Create.cshtml Added View : \Views\Contacts\Edit.cshtml Added View : \Views\Contacts\Details.cshtml Added View : \Views\Contacts\Delete.cshtml Added View : \Views\Contacts\Index.cshtml RunTime 00:00:07.87
使用命令行进行 Scaffolding:我们可以通过命令行生成,通过按住 Shift 键并右键单击来指向项目文件夹,然后会弹出命令窗口。使用以下命令获取帮助信息。
命令: dotnet aspnet-codegenerator --help
让我们使用以下命令以及项目路径、控制器、模型信息来生成控制器和视图。
命令: dotnet aspnet-codegenerator --project "E:\Documents\Article\ScaffoldingCoreMVC\CoreMVCScaffolding\src\CoreMVCScaffolding" controller --force --controllerName ContactsController --model CoreMVCScaffolding.Models.Contacts --dataContext CoreMVCScaffolding.Models.PhoneBookContext --relativeFolderPath Controllers --controllerNamespace CoreMVCScaffolding.Controllers –useDefaultLayout
正如我们所见,控制器和视图已成功使用 MVC 模型生成。在我们的示例应用程序中,如果我们注意到“错误列表”选项卡,会有一个关于将敏感信息从 DbContext 移出的警告。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { #warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings. optionsBuilder.UseSqlServer(@"Server=DESKTOP-5B67SHH;Database=PhoneBook;Trusted_Connection=True;"); }
让我们注释掉它。现在,在 Startup 类中,通过从 DbContext 移动连接字符串信息来添加服务。下面您可以看到添加服务的代码片段。
//This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddMvc(); var connection = @"Server=DESKTOP-5B67SHH;Database=PhoneBook;Trusted_Connection=True;"; services.AddDbContext<PhoneBookContext>(options => options.UseSqlServer(connection)); }
如果我们现在尝试运行应用程序,将会发生以下异常。这是异常消息。
InvalidOperationException: No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions<TContext> object in its constructor and passes it to the base constructor for DbContext.
它说,未为此 DbContext 配置数据库提供程序。请注意,我们在 ConfigureServices(IServiceCollection services) 方法中使用了 AddDbContext。
services.AddDbContext<PhoneBookContext>(options => options.UseSqlServer(connection));
但我们没有将其传递给 DbContext。我们需要添加以下构造函数,以便将其传递给 DbContext 的基类构造函数。
public PhoneBookContext(DbContextOptions<PhoneBookContext> options) : base(options) { }
现在我们可以按 Ctrl+f5 运行我们的示例应用程序,或者使用以下命令运行。
命令: dotnet run
打开浏览器,访问 https://:5000,应用程序最终运行。
联系人列表
创建新联系人
编辑现有联系人
查看现有联系人详情
删除现有联系人
希望这会有所帮助 :)
参考文献
- https://docs.microsoft.com/en-us/ef/core/index
- https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet
- https://github.com/aspnet/EntityFramework/wiki/Roadmap
- https://codeproject.org.cn/articles/1118189/crud-using-net-core-angularjs-webapi