文件管理 · 2022年7月25日

t4模板生成文件路径|创建代码生成器可以很简单:如何通过T4模板生成代码[下篇]

Ⅰ 哪位大哥有 tangible t4 editor 的破解版

前不久写了一个基于T4模板的代码生成器Smart Code Generator,现已开源到CodePlex … 06 RAD Studio XE5破解补丁回 绿色版 06 XE5破解补丁 编程其它答 / 32KB 07 07 …

Ⅱ fluentdata 性能怎么样

FluentData,它是一个轻量级框架,关注性能和易用性的软件。 本语法:1. 初始化:获取文件模板 在T4模板导入//导入MultipleOutputHelper.ttinclude文件 路径 <#@include file="$(SolutionDir)\ORM.Model\T4\MultipleOutputHelper.ttinclude"#> 2.文件块:使用代码标识区分生成的代码块的范围 manager.StartNewFile(tb_name+".cs");/代码块 manager.EndBlock();3.编译执行:使用Process方法,进行文件分割

Ⅲ c# T4文本模版到底有什么用什么时候用

t4模板定义的是生成类的模板,用于自动生成代码

Ⅳ 在entity framework中怎么调用存储过程

一、使用存储过程的必要性我们知道EF通过元数据,即概念模型(Concept Model)、存储模型(Storage Model)和概念/存储映射(C/S Mapping),和状态追踪(State Tracking)机制可以为基于模型的操作自动生成SQL。对于一些简单的项目开发,这是非常理想的,因为他们完全可以不用关注数据存储层面的东西,你可以采用一些完全不具有数据库知识的开发者。但是理想总归是理想,对于企业级开发来说,我们需要的是对数据库层面数据的操作有自己的控制。在这方面,我们可以随便举两个典型的场景:逻辑删除:对于一些重要的数据,我们可能需要让它们永久保存。当我们试图“删除”这些数据的时候,我们并不是将它们从数据表中移除(物理删除),而是为这条记录作一个已经被删除的标记;并发处理:为了解决相同的数据在获取和提交这段时间内被另一个用户修改或者删除,我们往往SQL层面增加并发控制的逻辑。比较典型的做法是在每一个表中添加一个VersionNo这样的字段,你可以采用TimeStamp,也可以直接采用INT或者GUID。在执行Update或者Delete的SQL中判断之前获取的VersionNo是否和当前的一致。让解决这些问题,就不能使用EF为我们自动生成的SQL,只有通过使用我们自定义的存储过程。二、实现存储过程自动匹配的必要条件本篇文章提供的存储过程自动映射机制是通过代码生成的方式完成的。说白了,就是读取原来的.edmx模型文件,通过分析在存储模型中使用的数据表,导入基于该表的CUD存储过程;然后再概念/存储映射节点中添加实体和这些存储过程的映射关系。那实现这样的代码生成,需要具有如下三个固定的映射规则。数据表名-存储过程名:这个映射关系帮助我们通过存储模型中的实体名找到对应CUD三个存储过程(如果实体是数据表);数据表列名-存储过程参数名:当存储过程被执行的时候,通过这个映射让概念模型实体某个属性值作为对应的参数;存储过程参数名-版本:当进行参数赋值的时候,通过这个映射决定是使用Original或者Current版本。在实际的开发过程中,这样的标准存储过程一般都是通过代码生成器生成的(在我的文章《创建代码生成器可以很简单:如何通过T4模板生成代码?[下篇]》中有过相应的实现),它们具有这样的映射关系。基于这三种映射关系,我定义了如下一个名为IProcereNameConverter的接口。其中OperationKind是我自定义的一个表示CUD操作类型的枚举。 1: public interface IProcereNameConverter 2: { 3: string GetProcereName(string tableName, OperationKind operationKind); 4: string GetColumnName(string parameterName); 5: DataRowVersion GetVersion(string parameterName); 6: } 7: 8: public enum OperationKind 9: { 10: Insert, 11: Update, 12: Delete 13: }按照我们当前项目采用的命名规范,我定义了如下一个默认的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: public class DefaultNameConverter: IProcereNameConverter 2: { 3: public string GetProcereName(string tableName, OperationKind operationKind) 4: { 5: switch (operationKind) 6: { 7: case OperationKind.Insert: 8: return string.Format("P_{0}_I", tableName.Substring(2)); 9: case OperationKind.Update: 10: return string.Format("P_{0}_U", tableName.Substring(2)); 11: default: 12: return string.Format("P_{0}_D", tableName.Substring(2)); 13: } 14: } 15: 16: public string GetColumnName(string parameterName) 17: { 18: return parameterName.Substring(2).ToUpper(); 19: } 20: 21: public DataRowVersion GetVersion(string parameterName) 22: { 23: if(parameterName.StartsWith("o")) 24: { 25: return DataRowVersion.Original; 26: } 27: else 28: { 29: return DataRowVersion.Current; 30: } 31: } 32: }三、通过T4生成新的.edmx模型我们采用的基于T4的代码生成,了解EF的应该对T4不会感到陌生了。如果对代码生成感兴趣的话,可以看看我的文章《与VS集成的若干种代码生成解决方案[博文汇总(共8篇)]》。这里利用借助于T4 ToolBox这个开源工具箱,并采用SQL Server SMO获取存储过程信息。所有涉及到的文本转化都实现在如下一个ProcereMappingTemplate类型中,由于内容较多,具体实现就忽略了,有兴趣的朋友可能下载源代码。ProcereMappingTemplate具有两个构造函数的参数分别表示:源.edmx文件,服务器和数据库名,存储过程的Schema(默认为dbo)和具体的ProcereNameConverter(默认为DefaultNameConverter)。 1: public class ProcereMappingTemplate: Template 2: { 3: public XmlDocument SourceModel { get; private set; } 4: public IProcereNameConverter ProcereNameConverter { get; private set; } 5: public Database Database { get; private set; } 6: public string Schema { get; private set; } 7: 8: public ProcereMappingTemplate(string sourceModelFile, string serverName, string databaseName); 9: public ProcereMappingTemplate(string sourceModelFile, string serverName, string databaseName, 10: IProcereNameConverter procereNameConverter, string schema); 11: 12: protected virtual XElement GenerateStorageModelNode(); 13: protected virtual XElement GenerateMappingNode(); 14: public override string TransformText() 15: { 16: XElement newStorageModelNode = this.GenerateStorageModelNode(); 17: XElement newMappingNode = this.GenerateMappingNode(); 18: 19: XmlNode storageModelNode = this.SourceModel.GetElementsByTagName("edmx:StorageModels")[0]; 20: storageModelNode.InnerXml = newStorageModelNode.Elements().ToArray()[0].ToString(); 21: 22: XmlNode mappingNode = this.SourceModel.GetElementsByTagName("edmx:Mappings")[0]; 23: mappingNode.InnerXml = newMappingNode.Elements().ToArray()[0].ToString(); 24: 25: this.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); 26: this.Write(this.SourceModel.DocumentElement.OuterXml.Replace("xmlns=\"\"","")); 27: return GenerationEnvironment.ToString(); 28: } 29: }在使用过程中,你只需要在tt模板中创建这个ProcereMappingTemplate对象,调用Render方法即可。 1: <#@ template debug="true" hostSpecific="true" #> 2: <#@ output extension=".edmx" #> 3: <#@ assembly name="Microsoft.SqlServer.ConnectionInfo" #> 4: <#@ assembly name="Microsoft.SqlServer.Smo" #> 5: <#@ assembly name="Microsoft.SqlServer.Management.Sdk.Sfc" #> 6: <#@ assembly name="$(TargetDir)Artech.ProcereMapping.dll" #> 7: <#@ import namespace="Artech.ProcereMapping" #> 8: <#@ include file="T4Toolbox.tt" #> 9: <# 10: new ProcereMappingTemplate(this.Host.ResolvePath("UserModel.edmx"),".","EFExtensions").Render(); 11: #>四、看看生成出来的.emdx通过上面创建的TT模板(你指定的数据库中一定要存在具有相应映射关系的存储过程),新的.edmx模型文件会作为该tt文件的依赖文件被生成出来。而这个新生成的.edmx具有存储过程映射信息。具体来说,下面是原始的.edmx文件(只保留元数据节点)。 1: <?xml version="1.0" encoding="utf-8"?> 2: <edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx"> 3: <!– EF Runtime content –> 4: <edmx:Runtime> 5: <!– SSDL content –> 6: <edmx:StorageModels> 7: <Schema Namespace="Artech.UserModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl"> 8: <EntityContainer Name="ArtechUserModelStoreContainer"> 9: <EntitySet Name="T_USER" EntityType="Artech.UserModel.Store.T_USER" store:Type="Tables" Schema="dbo" /> 10: </EntityContainer> 11: <EntityType Name="T_USER"> 12: <Key> 13: <PropertyRef Name="USER_ID" /> 14: </Key> 15: <Property Name="USER_ID" Type="varchar" Nullable="false" MaxLength="50" /> 16: <Property Name="USER_NAME" Type="nvarchar" Nullable="false" MaxLength="50" /> 17: </EntityType> 18: </Schema> 19: </edmx:StorageModels> 20: <!– CSDL content –> 21: <edmx:ConceptualModels> 22: <Schema Namespace="Artech.UserModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2008/09/edm"> 23: <EntityContainer Name="EFExtensionsEntities" annotation:LazyLoadingEnabled="true"> 24: <EntitySet Name="Users" EntityType="Artech.UserModel.User" /> 25: </EntityContainer> 26: <EntityType Name="User"> 27: <Key> 28: <PropertyRef Name="ID" /> 29: </Key> 30: <Property Name="ID" Type="String" Nullable="false" MaxLength="50" Unicode="false" FixedLength="false" /> 31: <Property Name="Name" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" /> 32: </EntityType> 33: </Schema> 34: </edmx:ConceptualModels> 35: <!– C-S mapping content –> 36: <edmx:Mappings> 37: <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs"> 38: <EntityContainerMapping StorageEntityContainer="ArtechUserModelStoreContainer" CdmEntityContainer="EFExtensionsEntities"> 39: <EntitySetMapping Name="Users"> 40: <EntityTypeMapping TypeName="Artech.UserModel.User"> 41: <MappingFragment StoreEntitySet="T_USER"> 42: <ScalarProperty Name="ID" ColumnName="USER_ID" /> 43: <ScalarProperty Name="Name" ColumnName="USER_NAME" /> 44: </MappingFragment> 45: </EntityTypeMapping> 46: </EntitySetMapping> 47: </EntityContainerMapping> 48: </Mapping> 49: </edmx:Mappings> 50: </edmx:Runtime> 51: </edmx:Edmx>这是新生成的.edmx文件中的XML。

Ⅳ 怎样知道UG模版文件当前的位置路径

1、鼠标右击“我的电抄脑”选择“属性”然后选择“高级系统设置”找到“环境变量”

Ⅵ 怎样知道UG模版文件当前的位置路径

1、NX6.0\NX7.0\NX7.5\NX8.0\NX8.5\NX9.0\NX10.0建模模板文件位置!2、UG建模模板文件位置(修改UG默认实体颜色、默认片体颜色、点、默认线颜色、默认背景色,等众多默认设置):3、X:\ProgramFiles\Siemens\NX10.0\LOCALIZATION\prc\simpl_chinese\startup\model-plain-1-mm-template.prt4、改文件问可读,把只读勾掉

Ⅶ 关于.net T4模板的问题

List<String> TableNames=GetDataBseTables(); 方法名写错了 , 你是用了那个啥编辑器么 , 能智能提示的 , 那个不知道为啥很版多错误的 , , ,写了几次后 , 我果断弃用权它了 , , ,

Ⅷ C#成功生成T4模板,运行却提示表名无效

T4是一个.net平台上的模板生成器,可以使我们根据具体的数据库生成相应的固定的类文件回或接口,本片答博客主要是根据EF中的model来生成相应的文件,先进行一个实例(生成抽象工厂类的模板),然后再讲一些理论的东西

Ⅸ 创建代码生成器可以很简单:如何通过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的代码生成方式