1. 程式人生 > >Oracle,Mysql,SQlserver生成實體對映之SqlSugarT4

Oracle,Mysql,SQlserver生成實體對映之SqlSugarT4

官網:http://www.codeisbug.com

程式碼已上傳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="
System.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"); #>
View Code

注:我在頭部引用了這個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專案是可以進行修改的:根據你的需要進行修改,然後生成