65.9K
CodeProject 正在变化。 阅读更多。
Home

Scaffolding ASP.Net Core MVC

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (7投票s)

2016年12月8日

CPOL

3分钟阅读

viewsIcon

21121

downloadIcon

234

在本文中,我们将探讨如何借助 Entityframework Core 命令行工具,基于现有数据库(数据库优先)创建模型,然后学习如何使用 Scaffolding(接口和代码生成器命令)基于模型生成控制器和视图。

以下是主题

  1. 管理程序包
  2. EF Core 模型(数据库优先)
  3. MVC Core Scaffolding

创建新项目:文件 > 新建 > 项目

从左侧菜单中选择 .Net Core > ASP.Net Core Web Application

coremvc_2

选择 ASP.Net Core 示例模板,然后单击“确定”。

coremvc_3 这是解决方案资源管理器中示例模板的初始视图。

coremvc_4

使用 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

使用命令行在我们的示例应用程序中,我们将使用命令行应用命令。

coremvc_5

转到项目目录 > 按住 Shift 键并右键单击以打开命令窗口。

coremvc_6 命令: dotnet ef –help

coremvc_7

命令: dotnet ef dbcontext scaffold "Server=DESKTOP-5B67SHH;Database=PhoneBook;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer --output-dir Models

coremvc_8

从解决方案资源管理器可以看到,已创建包含 Context 和 Entities 的 Models 文件夹。

coremvc_9

生成的 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 项

coremvc_10

选择代码生成方式的 scaffolding 选项。

coremvc_11

现在,提供将用于与数据库交互的模型和上下文类,选择视图选项,然后单击“添加”按钮执行操作。

coremvc_12

稍等片刻,从解决方案资源管理器可以看到视图已生成。

coremvc_13

输出消息如下所示。

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

coremvc_14

让我们使用以下命令以及项目路径、控制器、模型信息来生成控制器和视图。

命令: 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

coremvc_15

正如我们所见,控制器和视图已成功使用 MVC 模型生成。在我们的示例应用程序中,如果我们注意到“错误列表”选项卡,会有一个关于将敏感信息从 DbContext 移出的警告。

coremvc_16 这是导致警告的 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.

coremvc_17

它说,未为此 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

coremvc_18

打开浏览器,访问 https://:5000,应用程序最终运行。

联系人列表

coremvc_19

创建新联系人

coremvc_20

编辑现有联系人

coremvc_21

查看现有联系人详情

coremvc_22

删除现有联系人

coremvc_23

希望这会有所帮助 :)

参考文献

  1. https://docs.microsoft.com/en-us/ef/core/index
  2. https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet
  3. https://github.com/aspnet/EntityFramework/wiki/Roadmap
  4. https://codeproject.org.cn/articles/1118189/crud-using-net-core-angularjs-webapi

 

© . All rights reserved.