nopCommerce_4.40.3 功能实现详解----- 第10章 FluentMigrator中间件简单示例实现

nopCommerce开发者按照健壮性、安全性、可扩展性、兼容性、功能强大和适用范围广等标准,对数据层进行了定义,这也造成了数据层的定义实现及其复杂,学习曲线十分陡峭,下面将通过三个简单的示例以逐步递进的式来讲解nopCommerce开发者,是怎样利用FluentMigrator中间件来实现,程序与指定的数据软件中的数据库及其表进行数据交互操作的,以降低大家对FluentMigrator中间件和nopCommerce数据层的学习曲线。

1 Fluentmigration.Demo

    1、打开网页:https://dotnetcorecentral.com/blog/fluentmigrator/,按照其中的内容,新建程序Fluentmigration.Demo和其中的相关定义,执行程序后在Microsoft SQL Server数据库软件中自动生成“Demo”数据库及其“Employee”表。 对以上功能更为具体实现和注释见:21-08-03_Fluentmigration.Demo(001_自动生成源示例所定义的数据库及其表 )。

    2、上一个示例所自动生成的表及其约束规则是通过一个迁移类直接定义的。在nopCommerce程序中这些操作被分别割裂在三种类中进行定义实现的,它们分别是:自动生成的表是通过实体类定义;约束规则是通过约束规则类定义;执行迁移操作由迁移类直接定义。该示例就通过nopCommerce程序中的“Customer” 实体类,约束规则类“CustomerTable”和迁移类“MigrationExtension”,在执行程序后在Microsoft SQL Server数据库软件中自动生成“Demo”数据库及其“Customer”表。 对以上功能更为具体实现和注释见:21-08-03_Fluentmigration.Demo(002_自动生成数据库及其表Customer,但表与实体类中的属性映射关系不完整)。

3、上一个示例所自动生成的“Customer”表中的字段只与约束规则类“CustomerTable”中的定义相对应,并不与“Customer” 实体类中的成员属性相对应,这种对应关系搞反了。在nopCommerce程序中表中的字段首先要与实体类中的成员属性相对应后,然后根据程序中相应的约束规则类,在程序执行后把该约束规则映射到指定的表及其字段上。根据nopCommerce程序数据层中的定义对约束规则类“CustomerTable”进行重构,在执行程序后在“Demo”数据库的“Customer”表中的字段已经与“Customer” 实体类中的成员属性相对应了。对以上功能更为具体实现和注释见:21-08-03_Fluentmigration.Demo(003_自动生成数据库及其表Customer,但约束规则不能映射到表对应的字段上)。

4、上一个示例解决了实体类属性成员与相关表中字段的映射对应操作,但是约束规则类中所定义的约束规则,并没有被映射的该表及其相应的字段上。在Fluentmigration.Demo中添加nopCommerce程序数据层中Mapping及其相关定义,进行一步重构约束规则类“CustomerTable”,执行程序后“Demo”数据库的“Customer”表中相关字段的约束规则已经被定义了。对以上功能更为具体实现和注释见:21-08-03_Fluentmigration.Demo(004_自动生成数据库及其表Customer,所有字段和约束规则)。

2 FMDemo

    Fluentmigration.Demo示例解决了在指定的数据库软件中,自动生成数据库、表、字段及其约束规则的目标,便是对于理解nopCommerce程序数据层中定义的实现逻辑与原理还是远远不够的。Fluentmigration.Demo是通过NuGet引用Dapper来实现在Microsoft SQL Server数据库软件中自动生成“Demo”数据库的,而nopCommerce程序是通过NuGet引用System.Data.SqlClient来实现在Microsoft SQL Server数据库软件中自动生成相应数据库的。

1、新建工程FMDemo,首先使用System.Data.SqlClient代替Dapper,执行程序后在Microsoft SQL Server数据库软件中自动生成“FMDemo”数据库的。对以上功能更为具体实现和注释见:21-08-04_FMDemo(001_只能在MicrosoftSQLServer中自动生成相应的数据库)。

2、添加nopCommerce程序数据层中Mapping及其相关定义,重构FMDemo.Startup.ConfigureServices方法在该方法中添加依赖注入操作定义,执行程序后“FMDemo”数据库、“Customer”表、字段和约束规则。从该示例我们可以很直接的看出:nopCommerce程序NopDbStartup类中所定义的依赖注入操作的相关定义主要是用来执行程序中定义的所有与迁移操作相关的类,它只与在指定数据库中自动生成相应的表相关,而与自动生成数据库无关。如果程序通过当前版本(2021年8月8日)的FluentMigrator数据交互中间件,进行程序与数据库的数据交换操作,表的自动生成必须在数据层中显式的进行,定义关于表的迁移操作类,在程序被执行后,才能够在数据库中自动生成表。从上述方面的因素来说在NopDbStartup类和FMDemo.Startup.ConfigureServices方法中添加依赖注入操作定义是必须的。对以上功能更为具体实现和注释见:21-08-04_FMDemo(002_在MicrosoftSQLServer中自动生成相应的数据库-表-字段-约束规则)。

3、重构FMDemo.Startup.ConfigureServices方法在该方法,使用nopCommerce程序NopDbStartup类中所定义的依赖注入操作,代替Fluentmigration.Demo中的依赖注入操作。该示例通过NopProcessorAccessor类的定义来选择与nopCommerce程序进行数据交互的数据库软件;通过DataSettingsManager.LoadSettings方法来获取与数据进行连接操作的数据库连接字符串。从该示例形如已经进行入了nopCommerce程序数据层实现的深水区了。对以上功能更为具体实现和注释见:21-08-04_FMDemo(001_只能在MicrosoftSQLServer中自动生成相应的数据库)。21-08-04_FMDemo(003_使用NopDbStartup定义在MicrosoftSQLServer中自动生成相应的数据库-表-字段-约束规则)

4、重构FMDemo.Controllers.HomeController.Index[HttpPost] 方法;定义IMigrationManager接口和MigrationManager类;重构FMDemo.Startup.ConfigureServices方法。通过FMDemo.Migrations.MigrationManager.ApplyUpMigrations方法代替runner.MigrateUp();来实现程序的迁移操作。该示例展示了nopCommerce程序数据层怎样通过MigrationManager类来统一调用和管理程序中的迁移操作的所有定义,这些定义包含:根据程序中定义的所有实体类、属性成员、和属性成员的类型,约束规则类,自动映射到相应的数据库中一个指定表及其字段上。对以上功能更为具体实现和注释见:21-08-04_FMDemo(004_通过迁移定义在MicrosoftSQLServer中自动生成相应的数据库-表-字段-约束规则)。

5、删除CustomerTable类,重构FMDemo.Migrations.MigrationManager类,进一步完善MigrationManager类对其它迁移类的统一的管理、调用和集中实例化的功能。把迁移约束类分割定义在二个类中它们分别是:NopMigrationAttribute、SchemaMigration。通过MigrationVersionInfo实体类和NopMigrationAttribute取代FluentMigrator中间件中的默认体,来实现对当前程序迁移操作相关数据库信息的持久化存储操作。对以上功能更为具体实现和注释见:21-08-05_FMDemo(005_通过SchemaMigration在MicrosoftSQLServer中自动生成相应的数据库-表-字段-约束规则)。

6、定义并使用InameCompatibility接口、BaseNameCompatibility类和NameCompatibilityManager类,nopCommerce开发者通这些类中的定义来保证实体类中的属性成员,与多个数据库软件的数据库表中的字段进行自动映射生成时的兼容性;通过ComponentModel中的类定义保证自动映射生成时健壮性、安全性。对以上功能更为具体实现和注释见:21-08-05_FMDemo(006_通过NameCompatibilityManager在MicrosoftSQLServer中自动生成相应的数据库-表-字段-约束规则)。

    通过上面6个示例程序已经可以平滑和容易的来理解nopCommerce对数据层的具体实现和调用逻辑了,但是还是不够直观,下面将通过Entity Framework Core中间件与FluentMigrator中间件的对比,从纵向上进行一步加深理解nopCommerce对数据层的逻辑实现。

3 EFCoreDemo

    Entity Framework和Entity Framework Core数据库数据交互中间件与.NET Framework和.NET Core框架都是是由微软设计开发的。相对FluentMigrator中间件来说Entity Framework Core中间件与.NET Core框架建构的程序,再加上Microsoft SQL Server数据库软件,三种同一家公司的产品进行相互耦合和配置更为天然和容易,同时后者比前者来说功能更为强大,这些因素造成了开发者使用Entity Framework Core中间件进行开发相对容易和傻瓜式很多。但是这些因素同样也造成了Entity Framework Core中间件也有封装比较严密的缺点。

1、新建工程EFCoreDemo,执行EFCoreDemo.Data.MSSQLServerDataProvider.CreateDatabase方法中的SQL命令脚本后,在Microsoft SQL Server数据库软件中自动生成“EFCoreDemo”数据库的。对以上功能更为具体实现和注释见:21-08-06_EFCoreDemo(001_只能在MicrosoftSQLServer中自动生成相应的数据库)。

2、定义IDbContext接口、NopObjectContext类,通过NopObjectContext类的拷贝构造方法调用Entity Framework Core中间件内置方法:Database.EnsureCreated();自动生成“EFCoreDemo”数据库。对以上功能更为具体实现和注释见:21-08-06_EFCoreDemo(002_通过Database.EnsureCreated只能在MicrosoftSQLServer中自动生成相应的数据库)。

3、重构NopObjectContext类中的类的拷贝构造方法,通过“程序包管理器控制台”,执行命令:

    (1)、Add-Migration EFCoreDemo

    (2)、Update-Database EFCoreDemo

自动在程序中生成迁移相关类,执行程序后,自动生成“EFCoreDemo”数据库。对以上功能更为具体实现和注释见:21-08-06_EFCoreDemo(003_通过Add-Migration只能在MicrosoftSQLServer中自动生成相应的数据库)。

4、添加Mapping和其中的相关定义,并覆写EFCoreDemo.Data.NopObjectContext.OnModelCreating方法、定义EFCoreDemo.Controllers.HomeController拷贝构造方法,执行程序后自动生成“EFCoreDemo”数据库及其表“Customer”。对以上功能更为具体实现和注释见:21-08-06_EFCoreDemo(002_通过Database.EnsureCreated只能在MicrosoftSQLServer中自动生成相应的数据库)。

5、重构EFCoreDemo.Controllers.HomeController、重构NopObjectContext类的拷贝构造方法,通过“程序包管理器控制台”,执行命令:

    (1)、Add-Migration EFCoreDemo

    (2)、Update-Database EFCoreDemo

自动在程序中生成迁移相关类,执行程序后,自动生成“EFCoreDemo”数据库及其表“Customer”。对以上功能更为具体实现和注释见:21-08-06_EFCoreDemo(003_通过Add-Migration只能在MicrosoftSQLServer中自动生成相应的数据库)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值