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、這個時候,我們可以將我們代碼同步到數據庫了。打開程序包管理控制臺。
6、我們將在這里執行EF的數據遷移命令。先介紹一下有哪些命令。>get-help?entityframework
可以看到有這么幾個命令,不多,他們的作用也有介紹,我們只需要會用其中幾個就行。常用的如下:>Add-Migration?[name]??????//添加遷移文件/初始化
>Update-Database???????????//執行遷移?沒有數據庫會自動創建
>Drop-Database????????????????//刪庫
>get-help?entityframework????//獲取幫助
>Script-Migration????????????//生成sql腳本,來手動遷移
7、我們添加遷移文件,這時候不會創建數據庫,只是創建一個遷移文件。>Add-Migration?init??????//添加遷移文件/初始化建庫
看到自動生成了Migrations文件夾,并在其中生成了幾個文件,并且打開了其中的xxxxxxx_init.cs這個文件。
我們發現這個類其實是時間_[name]來命名的,并且其中記錄了數據庫這次的變化。
8、執行遷移,更新到數據庫。
這里會自動為我們創建數據庫。如果你自己手動創建了,可能會報錯,因為里面缺了他自己的一張遷移記錄表。所以如果要自己創建數據庫,還得準備他遷移所需的表,索性就讓他自動創建庫了。>Update-Database???????????//執行遷移?沒有數據庫會自動創建
這邊看到已經執行完成,這次項目沒有任何變化,變化在數據庫那邊,我們打開數據庫軟件,去看看。
我們發現,多了個名為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文件夾下,如果不改,則會生成到根目錄下。
編譯一下,看看是否生成xml文件。
沒有問題,我們打開這個xml文件,看看里面什么結構。
我們看下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文件
把txt里面的內容拷貝過去到TestContext.cs的OnModelCreating方法里面就可以了。
總結
以上是生活随笔為你收集整理的ef生成mysql字段注释_EFcore+MySql 数据迁移的时候,怎么给表结构加注释?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python drop_duplicat
- 下一篇: 两个oracle数据库外网同步,利用DB