Part3-9 EF CORE-反向工程(杨中科)

一、概览

二、反向工程(Dbfirst根据数据库表来反向生成实体类)

  • 定义:根据数据库已有表反向生成实体类
  • 使用场景:新项目但是需要使用已存在数据库的旧表。
  • 命令行脚本:两种
      命令行脚本1:Scaffold-Dbcontext "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook" Microsoft.EntityFrameworkCore.SqlServer
      命令行脚本2(官网):dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook" Microsoft.EntityFrameworkCore.SqlServer
    例子:
    Scaffold-DbContext "server=DESKTOP-E3D2J8F\SQLEXPRESS;Database=ImportExcelMVCTest; user id=sa; Password=123456;TrustServerCertificate=true" Microsoft.EntityFrameworkCore.SqlServer
  • 生成结果
      1、数据库下面所有表都会一一对应生成实体类。
      2、生成一个继承DbContext的类,文件命名为:数据库名+Context
  • 生成的代码文件可能会不符合预期,但是可以手动进行修改:
      1、生成的实体类的类名可能不符合预期,例如数据库中的表:T_Books,生成的类名是TBook,去掉了 ”_“ 和结尾的 s ,可手动修改成预期的类名,比如改成Book。
      2、所有的配置信息没有针对每个实体类生成一个单独的配置类,而是将所有实体类的配置信息都些在继承Dbcontext类的里面,出于解耦考虑可以手动将配置信息单独写到配置文件中。
  • 特别注意
      1、如果需要运行第二次的反向工程,之前对代码的所有手动修改均会被覆盖。
      2、不建议把反向工具当成日常开发工具使用,不建议DBFirs
      3、基于以上及使用场景:尽量只是在针对新项目使用已有的数据库的需求背景下使用、同一个项目仅运行一次反向工程。
  • 其它:
    关于DbFirst、CodeFirst、ModelFirst的区别及定义可以另寻资料。

三、拓展

1、指定表,通过-tables 表1、表2 或者 -table 表A -table 表B 实现

Scaffold-DbContext "server=DESKTOP-E3D2J8F\SQLEXPRESS;Database=EFCore; user id=sa; 
Password=123456;TrustServerCertificate=true" Microsoft.EntityFrameworkCore.SqlServer  -tables T_Books

2、Context和Model指定的输出文件夹

  • -ContextDir 文件夹A/文件夹B
  • -OutputDir 文件夹
  • 这里文件夹一般是个相对路径,前缀隐式使用的是当前项目路径。
Scaffold-DbContext "server=DESKTOP-E3D2J8F\SQLEXPRESS;Database=EFCore; user id=sa; 
Password=123456;TrustServerCertificate=true" Microsoft.EntityFrameworkCore.SqlServer 
 -tables T_Books -ContextDir Context -OutputDir Model 

3、 -Force 强制覆盖

  • 对于已经被引入的实体,再二次引入就会出现如下图报错,可通过强制覆盖解决,但是如果原有的实体类中有Data Annotation配置也会被覆盖。
  • 需要根据实际情况选择是否强制覆盖,这里的报错也可以作为一种校验的方式,保证不重复引入同一个实体类。

4、保留数据库名称:-UseDatabaseNames

  • 这个我觉得看实际情况,如果你的数据库的命名很规范,就可以使用这个保证代码和数据库命名的一致性。
  • 如果你的数据库内命名就是混乱,可以让EFCORE自动帮你转的相对规范一些,就不要使用这个命令。

5、关于表之间的关系:一对多、多对多

  • 如果你的A表与B表在数据库中有关联关系,但是你的一次反向工程只引入A表,那么就会出现告警:EF Core 无法找到某个外键关联主表的实体类,因此跳过了该外键的生成。

  • 对于此,规范的解决方案:就是尽量把具有关联关系的表一起引入,如果实际确实不需要使用关联表也可以不用引入。


  • 关于具有多对多关系的两个表,如何生成实体类,可以参考官方文档。

  • 关于具有一对多关系的,实体类中会有一个关联属性,这里可以参考EF CORE的一对多如何配置


四、关于如何指定反向工程策略的思考

1、个人建议,在某些场景下,反向工程+手动修改代码应该是最优解。

  • 假设我有这样的一个报表需求,我的项目里面都是写报表需要的API接口,那么此时我对于我的项目要使用哪些数据表是不能充分考虑到位的,需要使用到的实体类会随着需求的新增逐渐新增。此时就会需要多次进行反向工程。
  • 但是如杨中科老师所说,如果需要运行第二次的反向工程,之前对代码的所有手动修改均会被覆盖,比如DBContext、实体类内的配置配置的细微修改。

2、默认情况下,实体类的配置信息都是默认存放在DBContext中的。

  • 所以对于实体类的所有配置要单独抽出来形式配置类。这里不明白的可以参考EF Core配置教程内关于实体类配置部分。


3、对1中的场景,基于EF CORE的特性,可以设计出如下方法完成新项目、旧表的配置。

  • 对于每次新增实体类,都使用反向工程命令
  • 但是使用完反向工程命令后,DbContext文件都是一个新的,需要对DbContext的代码稍微修正下
  • 刚新加的实体类,配置部分将其从DbContext中抽出来,手动将其单独形成类。
  • 对所有历史的、新增的实体类再手动以DbSet形式加入到DbContext中。

4、其实不使用反向工程,直接手动添加实体类、DbConetxt也可以,但是手动添加实体类主要还是表关系容易遗漏。

  • 所以在1这种场景下,使用反向工程的主要作用就是引入实体类,并获取到EFCORE对实体类配置形成的初版代码(EFCORE对命名得规范之类)、以及表中字段得具体配置信息(主要还是关联关系),再手工略微修改。
  • 至于DbContext,相当于就是手动制作了。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容