最近两个月将12年开发的果蔬行业ERP升级到.NET Core,表结构变化比较大,迁移数据比较麻烦,所以写一个迁移程序来解决。为了减少代码量,决定用EF Core
。EF Core
中提供了一个命令Scaffold-DbContext
,可以从数据库表生成模型类。
使用Scaffold-DbContext
命令需要项目中安装 Microsoft.EntityFrameworkCore.Design
和 Microsoft.EntityFrameworkCore.SqlServer
包,如果是MySQL
的话则安装 Pomelo.EntityFrameworkCore.MySql
然后就可以在 程序包管理器控制台 中运行 Scaffold-DbContext
命令了。
Scaffold-DbContext
执行 get-help Scaffold-DbContext
可以查看帮助,会输出一下信息
名称
Scaffold-DbContext
摘要
Scaffolds a DbContext and entity types for a database.
语法
Scaffold-DbContext [-Connection] <String> [-Provider] <String> [-OutputDir <String>] [-ContextDir <String>] [-Context <String>] [-Schemas <String[]>] [-Tables <String[]>] [-DataAnnotations] [-UseDatabaseNames] [-Force] [-Project <String>] [-StartupProject <String>] [<CommonParameters>]
说明
Scaffolds a DbContext and entity types for a database.
相关链接
about_EntityFrameworkCore
备注
若要查看示例,请键入: "get-help Scaffold-DbContext -examples".
有关详细信息,请键入: "get-help Scaffold-DbContext -detailed".
若要获取技术信息,请键入: "get-help Scaffold-DbContext -full".
有关在线帮助,请键入: "get-help Scaffold-DbContext -online"
参数
-Connection
数据库连接字符串,必须指定,不同数据库不一样-Provider
数据库的提供器-Project
指定将代码生成到哪个项目下-OutputDir
生成的代码放在项目的哪个目录下-Context
上下文名称-Force
强制重写-StartProject
启动项目
Provider
常用的有
- SQL Server
Microsoft.EntityFrameworkCore.SqlServer
- MySQL
Pomelo.EntityFrameworkCore.MySql
- SQLite
Microsoft.EntityFrameworkCore.Sqlite
示例代码
Scaffold-DbContext
-Connection "server=.;uid=user;pwd=pwd;database=databse;"
-Provider Microsoft.EntityFrameworkCore.SqlServer
-OutputDir Models
-Context MyDbConetxt
-Project xx
我程序中使用的是MySQL
,Provider
用的是 Pomelo.EntityFrameworkCore.MySql
,使用过程中遇到下面两个问题,同时给出解决办法。
- 主键使用的是
Guid
类型,表中存的类型为Char(36)
,这样生成的代码中为string
类型的,解决办法是在数据库连接字符串中加上GuidFormat=Char36
- 表中如果使用的是
bit
类型,生成的代码中则是ulong
类型的,如果想使用bool
类型,则需要在数据库连接字符串中加上TreatTinyAsBoolean=false
同时要注意的是,Pomelo.EntityFrameworkCore.MySql
要使用3.0以上的版本