之前有寫過兩篇,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這么垃圾,效率低下,啦啦啦~~~咱,不理你)