導航:首頁 > 文件教程 > t4模板生成文件地址

t4模板生成文件地址

發布時間:2023-02-12 18:03:48

⑴ 創建代碼生成器可以很簡單:如何通過T4模板生成代碼[下篇]

在《上篇》中我們通過T4模板為我們指定的數據表成功生成了我們需要的用於添加、修改和刪除操作的存儲過程。但是這是一種基於單個文件的解決方案,即我們必須為每一個生成的存儲過程建立一個模板。如果我們提供一種基於多文件的代碼生成方式,將會為編程人員帶來極大的便利。藉助於T4 ToolBox這個開源工具箱,多文件的SQL Generator的實現變得異常簡單。[文中的例子可以從這里下載]目錄
二、創建自定義的Generator
三、ProcereGenerator如何被使用?一、多文件代碼生成器會帶來多大的便利?我們先來直觀的感受一下較之《上篇》提供的單一文件的代碼生成器,基於多文件的代碼生成解決方案會為開發人員帶來多大的便利。 同樣對於《上篇》創建的數據表T_PRODUCT,之前我們為了生成三個不同的存儲過程,我們不得已需要創建3個不同的T4模板文件。實際上我們更需要的方式只需要創建一個T4模板,讓我們的SQL Generator自動為我們生成3個包含相應存儲過程的.sql附屬文件,如左圖所示(點擊看大圖)。有的時候,基於單個數據表的存儲過程生成方式我們依然覺得不方便。如果我們能夠在T4模板文件中指定的數據表的列表,讓我們的SQL Generator為列表的每一個數據表都生成CUD三個存儲過程,這樣的方式更加具有吸引力。如右圖所示(點擊看大圖),一個訂單模塊包含兩個具有主子關系的兩張表(T_ORDER和T_ORDER_DETAIL),現在我們在一個T4模板中指定這兩個表明,通過SQL Generator可以幫助我們生成6個包含存儲過程的.sql附屬文件。甚至有的時候我們連數據表列表都無需指定,讓SQL Generator為所有的表都生成相應的存儲過程。我的例子中沒有提供這樣的功能,但是實現自來不會存在任何問題。二、創建自定義的Generator在《上篇》中我創建了一個抽象的ProcereTemplate類,以及三個基於生成CUD存儲過程的具體ProcereTemplate:InsertProcereTemplate、UpdateProcereTemplate和DeleteProcereTemplate。它們都將直接服務於我們今天將要提供的基於多文件的SQL Generator。在《上篇》中,這四個Template分別定義在4個不同的TT文件中,3個具體的ProcereTemplate通過<#@include>指令將抽象ProcereTemplate模板文件包含過來。由於我們將要創建的T4模板將會使用到這四個類,如果我們用四個<#@include>指令將四個TT文件包含過來,由於T4引擎將會導致對ProcereTemplate的4次包含,最好將會導致變異問題。個人覺得這應該算是T4引擎解析包含關系的一個局限性,為了解決這個問題我們不得不抽象的ProcereTemplate和三個具體的ProcereTemplate都合並成一個TT文件。T4 ToolBox為類庫中為了提供了一個抽象的T4Toolbox.Generator類用於實現多文件的代碼生成。為此我們創建一個TT模板文件,定義了如下一個繼承自該類的ProcereGenerator。ProcereGenerator的核心是通過屬性Templates定義的類型為IEnumerable<ProcereTemplate>的ProcereTemplate列表,這個列表在存儲過程中進行初始化。而對於ProcereGenerator的構造函數,處理定義了一個表示資料庫連接字元串的databaseName的參數外,並以數組參數的形式指定了生成的存儲過程基於的數據表名的列表。<#@ import namespace="System.Collections.Generic" #><#@ include file="ProcereTemplate.tt" #><#@ include file="T4Toolbox.tt" #><#+publicclass ProcereGenerator : Generator{public IEnumerable<ProcereTemplate> Templates{get; private set;}public ProcereGenerator(string databaseName, paramsstring[] tableNames) {if(null == tableNames || tableNames.Length == 0) {thrownew ArgumentNullException("tableNames"); } this.Templates = InitlizeTemplates(databaseName,tableNames); }private IEnumerable<ProcereTemplate> InitlizeTemplates(string databaseName, string[] tableNames) { foreach(string tableName in tableNames) {yieldreturnnew InsertProcereTemplate(databaseName, tableName);yieldreturnnew UpdateProcereTemplate(databaseName, tableName);yieldreturnnew DeleteProcereTemplate(databaseName, tableName); } }protectedoverridevoid RunCore() {foreach(ProcereTemplate tempalte inthis.Templates) { tempalte.RenderToFile(tempalte.GetProcereName() + ".sql"); } }}#>真正的存儲過程的T-SQL腳本實現在重寫的RunCore中。由於具體的文本轉化邏輯都定義在了ProcereTemplate中了,所以在這里我們需要遍歷的ProcereTemplate集合中每一個Template對象,調用RenderToFile方法將相應的存儲過程的腳本寫入以存儲過程命名同名的.sql文件中。三、ProcereGenerator如何被使用?我們最後來看看我們創建的ProcereGenerator最終如何被應用於具體的代碼生成。其實很簡單,我們只需要創建相應的模板文件,通過<#@include>將定義ProcereGenerator類的TT文件包含近來,最後以代碼語句調用塊(<#StatementCode#>)的形式實力化該對象,並調用Run方法即可。在構造函數中指定資料庫連接字元串的名稱和數據表名的列表。下面是基於但表的T4模板。<#@ template language="C#" hostSpecific="true" debug="true" #><#@ include file="Templates\ProcereGenerator.tt" #><#new ProcereGenerator("TestDb","T_PRODUCT").Run();#>下面是基於多表的T4模板:<#@ template language="C#" hostSpecific="true" debug="true" #><#@ include file="Templates\ProcereGenerator.tt" #><#new ProcereGenerator("TestDb","T_ORDER","T_ORDER_DETAIL").Run();#>當你代碼生成工作執行之後,會多出一個與TT文件同名的附屬文件,你需要手工刪除掉它。從數據到代碼——通過代碼生成機制實現強類型編程[上篇]從數據到代碼——通過代碼生成機制實現強類型編程[下篇]從數據到代碼——基於T4的代碼生成方式創建代碼生成器可以很簡單:如何通過T4模板生成代碼?[上篇]

⑵ 如何提取PPT模版,並應用於另一個PPT中

1、首先將需要添加到另一個PPT中作為模板的PPT文件點擊保存。

⑶ 下載的ppt模板怎麼用

先打開自己希望更改模板的演示文稿,然後選擇「設計」→「主題」,點擊下拉箭頭,單擊「瀏覽主題」。然後就可以在彈出的「選擇主題或主題文檔」對話框中選擇想要借用的模板文件potx或者是pptx、pPS文件,甚至可以選擇一個Web頁文件來作為模板。

單擊板塊上的模板類型鏈接(如「幻燈片背景」→「美食」),就可以在右側板塊看到該類模板的名稱和提供商等內容。點擊「下載」按鈕即可將模板下載到你的硬碟中,並會自動用PowerPoint打開該模板。如果你對模板的效果滿意,可以用「另存為」將它保存為模板,以後就可以像普通模板那樣方便調用了。

⑷ 包含類功能的模板必須以類功能結尾

估計你是用錯括弧了 , , , 代碼塊是用<# #> , 表達式塊是<#= #> 寫一個類的話使用 <#+ #>

⑸ 如何看到 ef emdx.xml

一、使用存儲過程的必要性我們知道EF通過元數據,即概念模型(ConceptModel)、存儲模型(StorageModel)和概念/存儲映射(C/SMapping),和狀態追蹤(StateTracking)機制可以為基於模型的操作自動生成SQL。對於一些簡單的項目開發,這是非常理想的,因為他們完全可以不用關注數據存儲層面的東西,你可以採用一些完全不具有資料庫知識的開發者。但是理想總歸是理想,對於企業級開發來說,我們需要的是對資料庫層面數據的操作有自己的控制。在這方面,我們可以隨便舉兩個典型的場景:邏輯刪除:對於一些重要的數據,我們可能需要讓它們永久保存。當我們試圖「刪除」這些數據的時候,我們並不是將它們從數據表中移除(物理刪除),而是為這條記錄作一個已經被刪除的標記;並發處理:為了解決相同的數據在獲取和提交這段時間內被另一個用戶修改或者刪除,我們往往SQL層面增加並發控制的邏輯。比較典型的做法是在每一個表中添加一個VersionNo這樣的欄位,你可以採用TimeStamp,也可以直接採用INT或者GUID。在執行Update或者Delete的SQL中判斷之前獲取的VersionNo是否和當前的一致。讓解決這些問題,就不能使用EF為我們自動生成的SQL,只有通過使用我們自定義的存儲過程。二、實現存儲過程自動匹配的必要條件本篇文章提供的存儲過程自動映射機制是通過代碼生成的方式完成的。說白了,就是讀取原來的.edmx模型文件,通過分析在存儲模型中使用的數據表,導入基於該表的CUD存儲過程;然後再概念/存儲映射節點中添加實體和這些存儲過程的映射關系。那實現這樣的代碼生成,需要具有如下三個固定的映射規則。數據表名-存儲過程名:這個映射關系幫助我們通過存儲模型中的實體名找到對應CUD三個存儲過程(如果實體是數據表);數據表列名-存儲過程參數名:當存儲過程被執行的時候,通過這個映射讓概念模型實體某個屬性值作為對應的參數;存儲過程參數名-版本:當進行參數賦值的時候,通過這個映射決定是使用Original或者Current版本。在實際的開發過程中,這樣的標准存儲過程一般都是通過代碼生成器生成的(在我的文章《創建代碼生成器可以很簡單:如何通過T4模板生成代碼?[下篇]》中有過相應的實現),它們具有這樣的映射關系。基於這三種映射關系,我定義了如下一個名為IProcereNameConverter的介面。其中OperationKind是我自定義的一個表示CUD操作類型的枚舉。1::{3:stringGetProcereName(stringtableName,OperationKindoperationKind);4:stringGetColumnName(stringparameterName);5:DataRowVersionGetVersion(stringparameterName);6:}7:8:publicenumOperationKind9:{10:Insert,11:Update,12:Delete13:}按照我們當前項目採用的命名規范,我定義了如下一個默認的DefaultNameConverter。它體現的是這樣的映射關系,比如有個數據表明為T_USER(大寫,單詞之間用「_」隔開,並以T_為前綴),它對應的CUD存儲過程名分別為:P_USER_I、P_USER_U和P_USER_D(大寫,以代表存儲過程的P_為前綴,後綴_I/U/D表示CUD操作類型,中間為去除前綴的表名)。如果列名為USER_ID,參數名為p_user_id(小寫,加p_前綴)。如果需要用Original值為參數賦值,需要將p_前綴改成o_前綴(o_user_id)。1::IProcereNameConverter2:{3:publicstringGetProcereName(stringtableName,OperationKindoperationKind)4:{5:switch(operationKind)6:{7:caseOperationKind.Insert:8:returnstring.Format("P_{0}_I",tableName.Substring(2));9:caseOperationKind.Update:10:returnstring.Format("P_{0}_U",tableName.Substring(2));11:default:12:returnstring.Format("P_{0}_D",tableName.Substring(2));13:}14:}15:16:publicstringGetColumnName(stringparameterName)17:{18:returnparameterName.Substring(2).ToUpper();19:}20:21:(stringparameterName)22:{23:if(parameterName.StartsWith("o"))24:{25:returnDataRowVersion.Original;26:}27:else28:{29:returnDataRowVersion.Current;30:}31:}32:}三、通過T4生成新的.edmx模型我們採用的基於T4的代碼生成,了解EF的應該對T4不會感到陌生了。如果對代碼生成感興趣的話,可以看看我的文章《與VS集成的若干種代碼生成解決方案[博文匯總(共8篇)]》。這里利用藉助於T4ToolBox這個開源工具箱,並採用SQLServerSMO獲取存儲過程信息。所有涉及到的文本轉化都實現在如下一個ProcereMappingTemplate類型中,由於內容較多,具體實現就忽略了,有興趣的朋友可能下載源代碼。ProcereMappingTemplate具有兩個構造函數的參數分別表示:源.edmx文件,伺服器和資料庫名,存儲過程的Schema(默認為dbo)和具體的ProcereNameConverter(默認為DefaultNameConverter)。1::Template2:{3:publicXmlDocumentSourceModel{get;privateset;}4:{get;privateset;}5:publicDatabaseDatabase{get;privateset;}6:publicstringSchema{get;privateset;}7:8:publicProcereMappingTemplate(stringsourceModelFile,stringserverName,stringdatabaseName);9:publicProcereMappingTemplate(stringsourceModelFile,stringserverName,stringdatabaseName,10:,stringschema);11:12:();13:();14:()15:{16:XElementnewStorageModelNode=this.GenerateStorageModelNode();17:XElementnewMappingNode=this.GenerateMappingNode();18:19:XmlNodestorageModelNode=this.SourceModel.GetElementsByTagName("edmx:StorageModels")[0];20:storageModelNode.InnerXml=newStorageModelNode.Elements().ToArray()[0].ToString();21:22:XmlNodemappingNode=this.SourceModel.GetElementsByTagName("edmx:Mappings")[0];23:mappingNode.InnerXml=newMappingNode.Elements().ToArray()[0].ToString();24:25:this.WriteLine("");26:this.Write(this.SourceModel.DocumentElement.OuterXml.Replace("xmlns=\"\"",""));27:returnGenerationEnvironment.ToString();28:}29:}在使用過程中,你只需要在tt模板中創建這個ProcereMappingTemplate對象,調用Render方法即可。1:2:3:4:5:6:7:8:9:四、看看生成出來的.emdx通過上面創建的TT模板(你指定的資料庫中一定要存在具有相應映射關系的存儲過程),新的.edmx模型文件會作為該tt文件的依賴文件被生成出來。而這個新生成的.edmx具有存儲過程映射信息。具體來說,下面是原始的.edmx文件(只保留元數據節點)。1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24:25:26:27:28:29:30:31:32:33:34:35:36:37:38:39:40:41:42:43:44:45:46:47:48:49:50:51:

⑹ C#如何手動設置AssemblyVersion("1.0.*")的生成規則

默認用時間可能有它自己的原因,包括防止版本號重復、易於生成等。

如果像你說的用編譯內次數,那麼至少還容得有個文件存儲相應的次數吧?

查了下,有t4模板的(不知道你上面說的是不是這個),也有現成的github開源插件的,也有自定義build task的,你自己看看

stackoverflow.com/questions/43019832/auto-versioning-in-visual-studio-2017-net-core

網頁鏈接

⑺ 如何手工將Entity Framework 4.0升級到5.0

第一步:從NuGet安裝Entity Framework 5.0
首先,對現有的EF4.0項目,什麼都不要改,也不要刪。直接從NuGet安裝EF5。如果你是.NET4的項目,那實際上安裝的是4.4版的DLL,所以EF5的枚舉類型是不可以用的。如果你已經升級了.NET4.5,那就是完完全全的EF5。

NuGet會自動給你添加引用以及配置相關的config文件。

第二步:更新EDMX

打開現有的EDMX文件,在空白處點擊右鍵,選擇「Add Code Generation Item」

新版EF是用T4模板來生成一個個實體類的,而4.0中是擼在一個edmx里的,所以我們要選擇一種模板,這里明顯只有一種可選:

EF 5.x DbContext Generator

然後,VS會彈好幾個對話框,問你敢不敢運行生成腳本。顯然我們要確認運行。VS一頓小擼之後,你的新版EF實體類就生成好了:

第三步:更新CUD方法

現在,你的程序肯定編譯不過。因為EF4.0以後,增、刪、改的API變了。所以我們要對舊代碼做一些改動。

1. 插入操作:現在使用 context.類型.Add(具體對象) 來完成

2. 刪除操作:現在使用 context.類型.Remove(具體對象) 來完成

3. 更新操作:現在不需要Attach了,使用 context.Entry(具體對象).State = System.Data.EntityState.Modified 來完成

4. 如果你還需要ObjectSet<T>類型,必須通過一個適配器來強擼:

(context as IObjectContextAdapter).ObjectContext.CreateObjectSet<類型>();

再次編譯程序,應該就可以用了~

⑻ E人E本T4可以使用哪些日常的下載軟體啊另外下文件存放在什麼地方啊

呵呵,T4採用的是筆式交互操作系統,可運行兼容此系統的apk格式文件,你可以通過應用商城下載相關應用進行安裝使用。
如果下載網頁的圖片及其他文件,可以到T4存儲器--download文件夾下進行查看。
如果已經成功綁定手寫郵件,那麼通過郵件下載的文件會保存在T4存儲器--attachments文件夾下。

⑼ 微軟EF框架存儲過程問題,VS2012+.NET4.5+EF6.1.1

我用的是5.0沒這個問題,不過如果你理解T4模板的話這個問題很好解決。

這個應該是6.0重構了一些命名空間後,和VS原有的實體數據模型模板不一致了。

解決辦法如下:修改你的 xx.Context.tt 文件:

if(container.FunctionImports.Any())
{
#>
usingSystem.Data.Objects;//改成usingSystem.Data.Entity.Core.Objects;
usingSystem.Data.Objects.DataClasses;
usingSystem.Linq;
<#
}

⑽ T4記事本里的文件存儲有多頁保存嗎最近寫東西多,每次一頁一頁的存好麻煩。

可以啊,你先點編輯,然後選查看所有頁,然後再在多選項里勾選所有你要保存的記事本頁,然後分享成word或者圖片格式,就可以一次性存很多張了。

閱讀全文

與t4模板生成文件地址相關的資料

熱點內容
ps形狀放在哪個文件夾 瀏覽:263
南京網路資料庫怎麼找 瀏覽:963
電腦刪掉用戶帳號和數據怎麼恢復 瀏覽:344
得物app如何用微信支付 瀏覽:184
網路瀏覽加速器 瀏覽:788
蘋果7好端端開不了機 瀏覽:42
javadouble精度損失 瀏覽:308
手機截圖女孩圖標是什麼app 瀏覽:168
有一行數據為什麼不排序 瀏覽:535
直接調用js函數 瀏覽:835
天貓2045是什麼網站 瀏覽:189
提取文件夾里所有word文件 瀏覽:288
隔空投送一次能傳送多少個文件 瀏覽:347
拇指玩gpk文件安裝器 瀏覽:475
肖戰為那英打call數據是多少 瀏覽:699
網路優化的發展 瀏覽:719
3dmax打開高版本 瀏覽:177
文件字體一般多少 瀏覽:551
到哪裡知道新發布的app 瀏覽:58
iphone用藍牙滑鼠 瀏覽:212

友情鏈接