EFcodeFirst+T4=操縱任意數據庫


  之前有寫過兩篇,EF選擇Mysql數據源 跟 EF添加ADO.NET實體模型處直接選擇Oracle數據源,其方便之處就不多說了,使用DBfirst直接點點點就能與數據庫雙向更新,而且關鍵是方便我們使用T4,如:

(如果你對T4有個大概認識,只會通過ADO.NET實體模型進行集合遍歷,那么可以繼續看下去)

  但是現在如果要使用其他數據庫,卻又苦於找不到像前兩者一樣的For VS驅動安裝(這里表揚下MySQL跟Oracle,良心產品,對我.NET還是很友好的),那么就只能使用codefirst進行EF連接了,但是這樣一來,我們不僅多出手動創建一堆Model等的麻煩,而且,關鍵的我們用於T4的.edmx文件就沒了,這可咋整,T4中如何遍歷???

  解決辦法,我一開始覺得有好幾種,無非弄出一個集合來,一開始我想的是通過建個.cs,每個屬性名跟Table名一致,去遍歷屬性,得到Table名集合。遺憾的是我TM怎么也獲取不到屬性!!!

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ include file="EF.Utility.CS.ttinclude"#>
<#@ assembly name="E:\編程\C#\T4Test\T4Test\bin\Debug\Model.dll" #>
<#@ output extension=".cs" #>
<#//var ItemCollection = typeof(Assembly).GetProperties();
            //var ItemCollection = typeof(Model.ModelTest).GetProperties();
            
            //var ItemCollection = Assembly.Load("T4Test").ExportedTypes.Where(c=>c.FullName == "T4Test.T").FirstOrDefault().GetProperties();
#>

  然后用了一個挫辦法,直接文件讀取,創建一個.txt文件,逗號分隔多個表名。

  注意:最后一個逗號不要忽略(這是我代碼問題,懶得改)

對應的T4:

    

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ include file="EF.Utility.CS.ttinclude"#>
<#@ output extension=".cs" #>
<#
            


            string[] ItemCollection = new string[] { "" };
            using (StreamReader reader = new StreamReader(@"E:\編程\C#\T4Test\T4Test\txtFile.txt"))//注意這里的文件路徑是你硬盤的真實路徑,除非你將該txt文件放到T4生成器一致的目錄下。也很好理解吧?!
            {
                string nameStr = reader.ReadToEnd();
                int index = nameStr.LastIndexOf(',');
                nameStr = nameStr.Substring(0, index);
                ItemCollection = nameStr.Split(',');
            }        
#>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GISER.TMH.IDAL
{

<#

foreach(var entity in ItemCollection)
{

#>
    public partial interface I<#=entity#>Dal
    {
        //公共的方法封裝到了基接口中
        //存放IDal特有的一些方法
        //要使用獨有的方法,新建該類的partial類或接口來創建,不要在這里創建,容易被更改T4模板后覆蓋掉
    }

<#}#>

}

 

  下面以PostgreSQL為例

  1、新建類庫,Nuget下載Npgsql驅動。2.27

  

  2、類庫中新建ADO.NET實體模型,選擇空Codefirst

打開配置文件,標記2是Nuget驅動的時候自動加上的,標記1需要手動添加,標記3就是你的數據庫連接字符串,不多說。

  

  3、打開你的DbContext類,新建你的實體類跟對應的Dbset屬性。注意的是紅色框選的,改變table對應的“命名空間”,不修改的話,EF生成的sql表名實際上會是dbo.table1,於是就提示table1不存在,很尷尬。熟悉Pg的朋友肯定對public.table1熟悉吧,沒錯,改成public即可,具體看圖。

  4、新建個控制台程序或web客戶端,同樣要Nuget Pgsql EF2.2.7,跟上面一樣,然后配置也一樣要修改,重新生成。

測試:

  

目前位置,T4跟Pg的Codefirst都通了,喜歡跟我一樣用三層的同學,只需要用T4生成所有的partial類。一切又干凈而方便了。

但這里有時候經常改動數據庫的話,一個個T4按保存還是好麻煩,有朋友有解決辦法請留言哦

 

 

 

 

就是喜歡用EF,即使指定用Dapper,我也改成EF的使用方式。0 0.(這里有同學可能要說EF這么垃圾,效率低下,啦啦啦~~~咱,不理你)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM