ef生成mysql字段注释_EFcore+MySql 数据迁移的时候,怎么给表结构加注释?

前言:

CodeFirst运用的场景比较少,不代表CodeFirst不好,也不能和DbFirst去作比较,本来就是两个东西。

吐槽:

MySql.Data.EntityFrameworkCore 作为Oracle官方维护的组件,居然对EF很多API不支持或者无效,最后放弃使用,改用Pomelo.EntityFrameworkCore.MySql,这是第三方维护的,支持比官方好得多啊。

搭建开始:

1、首先我们需要创建一个.NetCore 3.1的控制台项目,就叫CodeFirstDemo,并且引入以下组件。

-Microsoft.EntityFrameworkCore.Tools 3.1.5

-Pomelo.EntityFrameworkCore.MySql 3.1.1

2、确定好链接字符串,注意:CodeFirst的时候,可以不用创建数据库,程序会自动创建,我们只需要保证能链接到数据库服务就行。server=127.0.0.1;port=3306; user id=root; password=123456;database=test;

3、创建一个Models文件夹,编写我们自己的实体类 UserInfo.csusing System.ComponentModel.DataAnnotations;

namespace CodeFirstDemo.Models

{

/// 

/// 用户表

/// 

public class UserInfo

{

/// 

///用户ID

/// 

[Key]

public string UserId { get; set; }

/// 

///用户名

/// 

public string UserName { get; set; }

/// 

///用户年龄

/// 

public int Age { get; set; }

}

}

4、编写我们项目的Context文件,根目录创建也行,单独建个文件夹存放也行,我这里直接放根目录, 取名为TestContext.csusing CodeFirstDemo.Models;

using Microsoft.EntityFrameworkCore;

namespace CodeFirstDemo

{

public class TestContext : DbContext

{

/// 

///配置

/// 

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

{

optionsBuilder.UseMySql("server=127.0.0.1;port=3306; user id=root; password=123456;database=test;");

}

/// 

///用户表对象

/// 

public DbSet UserInfo { get; set; }

/// 

///实体对象的配置

/// 

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

modelBuilder.Entity(entity =>

{

entity.HasComment("用户表");

entity.Property(t => t.UserId).HasComment("用户ID");

entity.Property(t => t.Age).HasComment("用户年龄");

entity.Property(t => t.UserName).HasComment("用户名");

});

}

}

}

注意看啊,表的备注和字段的备注是单独去设置的,而不是直接读取里面的内容,相当于注释咱们得再写一次,三个字段还好,100张表,每张表20个字段,可想这工作量,后面再说我们怎么解决的。

5、这个时候,我们可以将我们代码同步到数据库了。打开程序包管理控制台。

98dc906d5318e7eae8010c6feeddea41.png

0fe6a7709bd1376fdbdf064e62c0b417.png

6、我们将在这里执行EF的数据迁移命令。先介绍一下有哪些命令。>get-help entityframework

111d01ecc6e57cd6c3548f6a14a11a0f.png

可以看到有这么几个命令,不多,他们的作用也有介绍,我们只需要会用其中几个就行。常用的如下:>Add-Migration [name]      //添加迁移文件/初始化

>Update-Database           //执行迁移 没有数据库会自动创建

>Drop-Database                //删库

>get-help entityframework    //获取帮助

>Script-Migration            //生成sql脚本,来手动迁移

7、我们添加迁移文件,这时候不会创建数据库,只是创建一个迁移文件。>Add-Migration init      //添加迁移文件/初始化建库

cd23cc6a3e6a26eb5e09a1b1d9f43c0b.png

看到自动生成了Migrations文件夹,并在其中生成了几个文件,并且打开了其中的xxxxxxx_init.cs这个文件。

我们发现这个类其实是时间_[name]来命名的,并且其中记录了数据库这次的变化。

8、执行迁移,更新到数据库。

这里会自动为我们创建数据库。如果你自己手动创建了,可能会报错,因为里面缺了他自己的一张迁移记录表。所以如果要自己创建数据库,还得准备他迁移所需的表,索性就让他自动创建库了。>Update-Database           //执行迁移 没有数据库会自动创建

4a5b3011a9a926ea9d8668e74765b65a.png

这边看到已经执行完成,这次项目没有任何变化,变化在数据库那边,我们打开数据库软件,去看看。

3c21b3d367589960e7861358914cf270.png

我们发现,多了个名为Test的数据库,并且里面有两张表,一个UserInfo是我们自己创建的,还有就是他自己的迁移历史表。

到这里一个完成的CodeFirst已经完成了。

9、如果我们改了数据库实体,增加了一个字段或者修改了字段,咋搞?

我们还是执行这两句命令就行了,只是添加迁移文件的时候,名称不能和之前重复即可。>Add-Migration updateuserinfo      //添加迁移文件

>Update-Database           //执行迁移

10、如果你错误太多,或者迁移文件太多了,管理复杂,你可以用删除库,删除Migrations文件夹,再次初始化即可。>Drop-Database                //删库

>Add-Migration init      //添加迁移文件

>Update-Database           //执行迁移

11、回到开头的问题,当我有100张表,每张表20个字段的时候,备注应该怎么加,总不能挨个字段手写吧。

我的解决方案如下:

根据项目的xml文件,来解析生成这段代码,让我们免于手写浪费时间,前提是你的summary注释写的有用。

12、生成xml

项目名称上右键-->属性-->生成-->XML文档文件,我把他放在了App_Data文件夹下,如果不改,则会生成到根目录下。

4878f554f5beff6cc3d5c6b010ad26fe.png

编译一下,看看是否生成xml文件。

2aa7fe53dd7b91e28aac764da6093299.png

没有问题,我们打开这个xml文件,看看里面什么结构。

b2952acb138271e9be21d482a4096d16.png

我们看下xml结构:members-->member[name='T:CodeFirstDemo.Models.UserInfo']  这个节点下是用户表类注释。name属性是T开头的。

members-->member[name='P:CodeFirstDemo.TestContext.UserInfo']  这个节点下是我们Context的属性备注。name是P开头的。

这两个地方都可以得到表的名称或者备注。

再看字段的备注从哪里来。members-->member[name='P:CodeFirstDemo.Models.UserInfo.UserId']  这个节点下是我们UserInfo类的属性备注。name是P开头的。

所以说,xml文件中有我们所需的所有信息,包括字段名称。我们来写个方法读取xml并生成下面这段代码。modelBuilder.Entity(entity =>

{

entity.HasComment("用户表");

entity.Property(t => t.UserId).HasComment("用户ID");

entity.Property(t => t.Age).HasComment("用户年龄");

entity.Property(t => t.UserName).HasComment("用户名");

});

代码如下:我是写了个控制台程序专门来做这个事情,所以我把xml文件拷贝过去,再读取。string xmlPath = $"CodeFirstDemo.xml";//xml路径

XmlDocument xml = new XmlDocument();

xml.Load(xmlPath);

StringBuilder sbr = new StringBuilder();

XmlNodeList nodeList = xml.SelectNodes("//member");

foreach (XmlNode item in nodeList)

{

string name = item.Attributes["name"].Value;

if (name.IndexOf("P:CodeFirstDemo.TestContext.") > -1)

{

string property = name.Substring(name.LastIndexOf(".") + 1);

string txtstr = item.InnerText.Replace(" ", "").Replace("\r", "").Replace("\n", "");

sbr.AppendLine($"modelBuilder.Entity(entity =>");

sbr.AppendLine("{");

sbr.AppendLine($"entity.HasComment(\"{txtstr}\");");

foreach (XmlNode son in nodeList)

{

string sonname = son.Attributes["name"].Value;

if (sonname.IndexOf($"P:CodeFirstDemo.Models.{property}.") > -1)

{

string sonproperty = sonname.Substring(sonname.LastIndexOf(".") + 1);

string sontxtstr = son.InnerText

?.Replace("\"", "\\\"")

?.Replace(" ", "")

?.Replace("\r", "")

?.Replace("\n", "");

if (sontxtstr.ToLower().IndexOf("[notmapped]") == -1)

{

sbr.AppendLine($"entity.Property(t=>t.{sonproperty}).HasComment(\"{sontxtstr}\");");

}

}

}

sbr.AppendLine("});");

sbr.AppendLine("");

}

}

System.IO.File.WriteAllText("HasComment.txt", sbr.ToString());

Console.WriteLine(sbr);

执行之后,生成了txt文件

4a01e08fde27bbc0851a49014ae8df15.png

016f9ab3592887c8c2df3eb2717b720b.png

把txt里面的内容拷贝过去到TestContext.cs的OnModelCreating方法里面就可以了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10秒一部电影,全球首个5G数据连接完成

作者:李赓 概要:2017年10月17日、也就是上周二,高通在香港高调宣布——其面向移动终端的5G调制解调器芯片组,骁龙X50 5G调制解调器芯片组完成了全球首个5G连接,同时实现了千兆级速率并在28GHz毫米波频段上的数据连接。…

idea 不打开文件提示错误_解决IDEA误删out目录下的文件导致404无法访问的问题

前言有时候IDEA下写Web项目时可能会遇到如下问题:误删out目录下的文件导致开启服务器后无法访问页面的问题新增加一个页面或添加一张图片,在项目编译运行后,未能自动更新到out\artifacts\目录下,从而导致页面无法访问,或者图片未能…

华为生态链的全方位解读

来源: 本翼资本CapitalWings 概要:华为作为目前国内ICT行业的融合性创新龙头企业,其多年经营探索的经营模式和宝贵经验使得其成为传统制造业转型的标杆,而对于新兴企业,能够越过坎坷的探索之路,直接嫁接华…

洪小文:以科学的方式赤裸裸地剖析人工智能

来源: 微软研究院AI头条 概要:要想在未来实现人工智能这项“新”技术的最大化利用,必须清楚认识到人工智能到底是什么,过去我们做了什么,今天能做什么,未来又能有什么新的发展可能。 近两年来,人…

人工智能如何驱动实体经济?六大领域展望

来源:腾讯研究院 概要:科技进步正在成为推进经济发展的重要推动力,对中国经济发展的贡献率已经上升到56.2%。面对正在兴起的人工智能浪潮,如何占据行业发展制高点,如何促进与实体经济深度融合,形成新增长点…

《浪潮之巅》作者吴军最新演讲:超级人工智能

来源:亿欧 概要:10月22日,AMINO硅谷中国“新”大会在南京经济技术开发区举行。《浪潮之巅》作者、AMINO资本合伙人吴军发表了以《超级人工智能》为主题的演讲。 人工智能起源 我知道很多人都想听我讲人工智能是怎么回事儿?最近有…

mysql慢sql增加读写分离_MySQL主从同步+读写分离

MySQL主从同步读写分离实验拓扑:三台mysql数据库:192.168.80.101 主服务器 mysql192.168.80.102 从1服务器 mysql192.168.80.103 从2服务器 mysql192.168.80.104 调度器Amoeba服务器 jdk、amoeba192.168.80.105 mysql客户端 mysql第一部分:三…

Google公布OpenFermion:量子计算机的开源软件包

来源:转载自公众号「雷克世界」微信号:ROBO_AI 作者:Ryan Babbush、Jarrod McClean 编译:嗯~阿童木呀、多啦A亮 概要:OpenFermion是一个用于模拟电子(费米子)相互作用系统的库,它能够…

java 类集合_java集合类详解

一、集合类与数组的区别1.集合的长度可变,数组的长度固定;2.集合用来存放对象引用,数组用来存放基本类型的数据;二、集合类的关系1.Collection接口存储一组不唯一、无序的对象。2.List接口存储一组不唯一、有序(插入顺序)的对象。…

英特尔宣布推出“Nervana”神经网络处理器

原作者:Ryan Whitwam 译者:彭婷 概要:Nervana NNP就是基于这种计算设计的。这也是所谓的专用集成电路(ASIC),所以它无法应用于一般的计算任务。 科幻小说家和现代科技大型公司一致认为AI可以开辟出一条康庄…

java爬取button_学习使用Java的webmagic框架爬取网页内容

(一)使用前的配置:2,(1)添加依赖:us.codecraftwebmagic-core0.7.3us.codecraftwebmagic-extension0.7.3us.codecraftwebmagic-selenium0.7.3(2)从GitHub官网下载webmagic的压缩包(https://codeload.github.com/code4craft/webmagic/zip/maste…

异构智能吴韧:物联网是“伪命题”?智联网才是未来

概要:“咨询机构预测,在未来人工智能的市场上12%的比例的资金将用在人工智能芯片上。”吴韧表示,异构智能瞄准的就是人工智能本地芯片市场。 Novumind异构智能(以下简称异构智能)在火热的人工智能新闻里出现的次数屈指…

java栈编程题_Java实现栈和队列面试题

面试的时候,栈和队列经常会成对出现来考察。本文包含栈和队列的如下考试内容:(1)栈的创建(2)队列的创建(3)两个栈实现一个队列(4)两个队列实现一个栈(5)设计含最小函数min()的栈,要求min、push、pop、的时间复杂度都是O(1)(6)判断栈的push和p…

联合国《2017年信息经济报告》

来源:联合国 概要:数字经济已经深入到了人们生活的衣食住行等所有方面,其发展速度和方式超出人们的想象。数字经济将把人类带往何方?这还是一个难解的谜题。 数字经济已经深入到了人们生活的衣食住行等所有方面,其发展…

Amazon、Google、 Microsoft和IBM如何将人工智能作为一项服务出售

译者:李凌 概要:Alphabet、Amazon和Microsoft这几家公司都发现,在产品中植入人工智能后能让产品变得更加优秀,他们可以将这种做法转变成一项服务,然后作为一种基于蓬勃发展的云计算业务的增值服务出售给企业客户。 云计…

CB Insights发布2017全球AI企业100强,出门问问、碳云智能入选

来源:亿欧 概要:在美国加州圣芭芭拉举办的创新峰会(TheInnovation Summit)上,CB Insight的CEO Anand Sanwal揭晓了全球2017 AI100名单,评选出全球最有创新实力的100家AI公司,国内公司出门问问、…

Java树形转扁平_js把树形数据转成扁平数据

我就直接上代码了都是实际项目里面用到的1.假设这个json就已经是树型结构数据了(如果不知道怎么实现树型结构数据请看我另一篇博客)var compressedArrafcommon.treeDataToCompressed(json);/*******************************JS封装好的方法***********************************…

定位AI交互技术服务商,声智科技完成近亿元A轮融资,将拓展安防、汽车等新场景

来源:36Kr 摘要:“语音交互是人工智能相关技术的重要应用场景,而语音交互的核心和关键突破点在于远场。而国内真正有实力做好远场技术的团队是非常稀少的。” 定位人工智能交互技术服务商的声智科技(SoundAI)&#xff…

德国电信:5G有重复3G命运的风险!

来源:5G 摘要:德国电信:5G有重复3G命运的风险! 行业深度观察

DARPA发布产业振兴计划,继承摩尔智慧

来源: 传感器与物联网 摘要:高登摩尔(Gordon Moore)赖以成名的摩尔定律(Moores law)几十年来一直引导着产业的发展,也为DARPA日前发布的“电子产业振兴计划”(ERI)计划附加条例提供许多想法。 根据美国国防部先进研究计划署(DARPA)微系统技术…