[2core]EFCore对象关系映射

迁移问题

新建一个webapi项目,然后安装EFCore类库,以及ERCore.SqlServer类库,像使用ASP.NET 4.x一样采用DBFirst模式,创建ADO.NET实体数据模型。步骤没有错,可此时VS2022提示“项目的目标框架不包含实体框架运行时程序集。请查看项目属性页中的目标框架信息”,出现这个弹窗提示,我基本已经知道,EF里可以使用的“ADO.NET实体数据模型”,在EFCore中已经不能使用。鉴于巨硬一贯的风格,肯定是搞出了一套全新的工具,那就去官网查查,果然新工具出现在“ EFCore 》管理数据库架构 》反向工程 ”里。

解决方案

反向工程是基于数据库架构搭建实体类型类和 DbContext 类基架的过程。 可使用 EF Core 包管理器控制台 (PMC) 工具的 Scaffold-DbContext 命令或 .NET 命令行接口 (CLI) 工具的 dotnet ef dbcontext scaffold 命令执行这一过程。
要使用反向工程必须满足以下条件:
1)在进行反向工程之前,需要安装 PMC 工具(仅限 Visual Studio)或 CLI 工具。 
2)在要搭建基架的项目中安装 Microsoft.EntityFrameworkCore.Design 的 NuGet 包。
3)还需要为要进行反向工程的数据库架构安装适当的数据库提供程序。
反向操作执行命令,分为两种类型
.NET Core CLI:dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook" Microsoft.EntityFrameworkCore.SqlServer
Visual Studio:Scaffold-DbContext 'Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook' Microsoft.EntityFrameworkCore.SqlServer

操作流程

经过上述迁移问题和解决方案的分析学习,就可以动手实际操作一下了。
1.采用“ADO.NET实体数据模型”向导生成ORM模型和错误提示

  

2.采用全新的命令行式工具

  

 注意事项:

1)注意解决方案里,启动项目已从“jks.core.test.databases”切换成“jks.core.test.databases.entities”
2)注意程序包管理器控制台,默认项目已从“jks.core.test.databases”切换成“jks.core.test.databases.entities”
3)PM>命令行,主要构成是 Scaffold-DbContext '数据库连接字符串' Microsoft.EntityFramworkCore.SqlServer。还可以添加其他参数,请自信查阅官方文档。
4)要使用反向工程生成ORM映射对象,上图中jks.core.test.databases.entities项目需要安装以下程序集
  a)Microsoft.EntityFrameworkCore
  b)Microsoft.EntityFrameworkCore.Design
  c)Microsoft.EntityFrameworkCore.SqlServer
  d)Microsoft.EntityFrameworkCore.Tools
5)为什么要把反向工程产物输出到独立的项目?因为这些依靠工具自动生成的程序文件代码,最好不要改动,官网也给出了警告说:“如果从数据库中再次对模型进行反向工程,则对这些文件所做的任何更改都将丢失”。做大型项目肯定采用DBFirst模式,依据实际业务需求增删改数据表结构是不可避免之事,因此为了确保这些自动生成代码与数据表的一致性,故而将它们单独放在一个项目中管理。
6)EF还提供了其他作用的程序集,具体功能的使用可以自行研究。

TransactionScope 

在面向数据库编程的三层架构中,对于操作多张数据表的复杂业务逻辑编码,一般会在BLL层采用TransactionScope把功能逻辑代码包裹起来,然后一并提交到数据库。这种做法即实现了实际需求,又不会破坏代码结构和文件的独立性,所以,从EF切换成EFCore,我是十分关注TransactionScope类的,生怕被抛弃,结果很开心,巨硬没有抛弃这个类。

EFCore数据库脚本输出到控制台

在EF中要把发送给数据库的SQL脚本输出到控制台,只需要添加一行代码“DbContext.Database.Log = new Action<string>(o => { Console.WriteLine(o); });”即可,到了EFCore则不同,如下:

public partial class HRM_WACContext : DbContext
    {
        //输出到debug输出
        public static readonly ILoggerFactory LoggerFactoryDebug = new LoggerFactory(new[] { new DebugLoggerProvider() });
        // 输出到Console
        public static readonly ILoggerFactory LoggerFactoryConsole = LoggerFactory.Create(builder => builder.AddConsole());

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            //仅用于Development环境
            optionsBuilder.UseLoggerFactory(LoggerFactoryConsole);
        }
    }

注意事项:
1)引入包:Microsoft.Extensions.Logging
2)引入包:Microsoft.Extensions.Logging.Console
3)引入包:Microsoft.Extensions.Logging.Debug
 

总结

毕竟要实现跨平台,改变是不可避免的,看过自动生成的代码,确实要比上一代EF生成的代码更简洁、清晰。只是对于养成使用图形化向导的程序员来说,命令行式操作工具不够方便。总之,新式ORM工具是非常不错的。

测试源码:https://gitee.com/kinbor/jks.core.test.databases

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值