Oracle,Mysql,SQlserver生成實體對映之SqlSugarT4
程式碼已上傳GitHub:https://github.com/SeaLee02/sealee
本篇主要講使用SqlSugar包進行Model生成,不會在乎具體到資料的什麼型別對映成什麼型別。
環境:.net 4.6.1,Sqlsugar4
問題:我們寫程式碼跑是完全沒有問題的,不管是什麼資料庫,都是可以的。如果我們使用的T4就會有問題,Mysql和Oracle會報錯。解決辦法,下面說到。
①安裝我們的包,注意我的版本,然後生成,讓bin檔案生成我們的dll檔案
PS:T4模板裡面的程式碼你可以在專案中寫程式碼,除錯好,然後把程式碼複製進去
Sqlserver
② 建立T4檔案 把下面的程式碼複製進去
<#@ template debug="true" hostspecific="true" language="C#" #> <#@ import namespace="System.Collections.Generic" #> <#@ assembly name="$(SolutionDir)\Sealee.Util\bin\Debug\Sealee.Util.dll" #> <#@ assembly name="View CodeSystem.Core" #> <#@ assembly name="System.Xml" #> <#@ assembly name="System.Xml.Linq" #> <#@ assembly name="System.Data" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> <#@ import namespace="SqlSugar" #> <#@ import namespace="Newtonsoft.Json" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Web" #> <#@ import namespace="Sealee.Util" #> <#@ assembly name="$(SolutionDir)\SqlSugarDemo\bin\Debug\Newtonsoft.Json.dll" #> <#@ assembly name="$(SolutionDir)\SqlSugarDemo\bin\Debug\SqlSugar.dll" #> <# //CTRL+S將會執行該檔案的程式碼,自動作生實體 //當前專案目錄 string projectDir = Host.ResolveAssemblyReference("$(ProjectDir)"); //解決方案目錄 string solutionDir = Host.ResolveAssemblyReference("$(SolutionDir)"); var db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = @"server=PV-X00273458\SQLEXPRESS;uid=sa;pwd=123;database=SchoolDB", DbType = DbType.SqlServer, IsAutoCloseConnection = true, InitKeyType = InitKeyType.Attribute}); List<DbTableInfo> list = db.DbMaintenance.GetTableInfoList(); List<DbTableInfo> viewList = db.DbMaintenance.GetViewInfoList(); //表 foreach (DbTableInfo table in list) { string table_name = table.Name.ToCase(); db.MappingTables.Add(table_name, table.Name); List<DbColumnInfo> dd = db.DbMaintenance.GetColumnInfosByTableName(table.Name); foreach (DbColumnInfo item in dd) { db.MappingColumns.Add(item.DbColumnName.ToCase(), item.DbColumnName, table_name); } db.DbFirst.IsCreateAttribute().Where(table.Name).CreateClassFile(projectDir+"\\Model2","Modle"); } //檢視 foreach (DbTableInfo table in viewList) { string table_name = table.Name.ToCase(); db.MappingTables.Add(table_name, table.Name); List<DbColumnInfo> dd = db.DbMaintenance.GetColumnInfosByTableName(table.Name); foreach (DbColumnInfo item in dd) { db.MappingColumns.Add(item.DbColumnName.ToCase(), item.DbColumnName, table_name); } db.DbFirst.IsCreateAttribute().Where(table.Name).CreateClassFile(projectDir+"\\Model2","Modle"); } //db.DbFirst.IsCreateAttribute().CreateClassFile(projectDir+"\\Model","Modle"); #>
注:我在頭部引用了這個dll檔案和名稱空間,其實就是一個方法,用來處理我們的表明和欄位的
你也可以寫在T4裡面,然後進行呼叫(我是寫在程式碼中的,這裡就需要引用)
/// <summary> /// 字串處理 (_切分,首字母大寫 (.)去除 ) ----》 擴充套件方法 /// </summary> /// <param name="value"></param> /// <returns></returns> public static string ToCase(this string value) { if (string.IsNullOrEmpty(value)) { return string.Empty; } string[] arry = value.Split('_'); string str = ""; foreach (string item in arry) { string newstr = item.Replace("(", "").Replace(".", "").Replace(")", ""); string firstLetter = newstr.Substring(0, 1); string rest = newstr.Substring(1, newstr.Length - 1); str += firstLetter.ToUpper() + rest.ToLower(); } return str; }
注意這裡的連線,換成你的就可以了:
③右鍵執行自定義工具
然後檢視我們的專案,多了一個Model2資料夾,這個資料夾是不在我們的專案中的,你需要手動新增到我們的專案中
對應的我們的資料庫表:
Mysql
mysql的T4模板中我們只加了個dll和改變了連線方式其餘的都沒有變,然後就會提示我們dll沒有引用,如果我們除錯T4模板,他就會在new SqlSugarClient的時候出錯
Oracle
Oracle的錯誤跟Mysql是一毛一樣的。
*我們的目錄下一定是存在這個dll檔案的。
解決辦法:
https://github.com/sunkaixuan/SqlSugar git上面下載他的原始碼
他的這兩個dll跟我們現在引用的不是同一個版本。
開啟專案,我們需要把SqlSuagr從新生成一下,然後進行引用試試
①改變框架,跟你現在建立的專案保持一致
②先刪除他原來的這個兩個dll引用,然後從我們的nuget上下載最新的,然後從新生成得到我們最新的SqlSugar.dll檔案
③回到我們的專案,進行解除安裝sqlSugar,然後引用我們生成的sqlSugar.dll,然後從新生成
④開啟我們的MysqlT4模板,執行
然後並沒有儲存,再檢視我們的專案,生成成功
對於有些關鍵字還是會沒有對映到,因為我們這裡的名字和資料庫的名字不一致,所以所有的欄位必須對映,我們需要手動新增一下(看後面能不能把這個bug解決了)
using System; using System.Linq; using System.Text; using SqlSugar; namespace ModleMysql { ///<summary> /// ///</summary> [SugarTable("datatestinfo2")] public partial class Datatestinfo2 { public Datatestinfo2(){ } /// <summary> /// Desc: /// Default: /// Nullable:False /// </summary> [SugarColumn(ColumnName="PK")] public string Pk {get;set;} /// <summary> /// Desc: /// Default: /// Nullable:False /// </summary> public string Text1 {get;set;} /// <summary> /// Desc: /// Default: /// Nullable:False /// </summary> public bool Bool1 {get;set;} /// <summary> /// Desc: /// Default: /// Nullable:False /// </summary> public bool Bool2 {get;set;} } }View Code
⑤執行我們的OracleT4模板(靠,我在公司跑就報錯,在家跑就正常??)
ps:如果你重新引用了,還是報同樣的錯誤,請把專案重啟,如果還是報錯,就執行除錯T4模板進行跑專案(除錯一定是不會報錯的)
值得一提:我們下載的Sqlsugar專案是可以進行修改的:根據你的需要進行修改,然後生成