有没有一种方法可以在命名空间中读取并使用反射或其他东西循环遍历t4模板中的所有类?
<#foreach (class poco in LoadNamespace("Web.Code.Entities.Poco").Classes ) { #>
public interface I<# poco.ClassName #>Repository
{
IQueryable< <# poco.ClassName #> > Get();
<# poco.ClassName #> Save(<# poco.ClassName #> entity);
bool Delete(<# poco.ClassName #> entity);
}
<#} #>
Run Code Online (Sandbox Code Playgroud)
示例元数据:
namespace Web.Code.Entities.Poco
{
public class Product
{
public int Id { get; set; }
public string Name{ get; set; }
public string Category{ get; set; }
}
public class Employee
{
public int Id { get; set; }
public string Name{ get; set; …Run Code Online (Sandbox Code Playgroud) 我刚刚下载了sharparchitecture/Northwind,我正在努力让crud脚手架工作.除了添加对此类库的缺少引用之外,我什么都没做.我尝试运行ScaffoldingGeneratorCommand.tt,然后点击3个错误.
错误1编译转换:类,结构或接口成员声明文件中的标记'this'无效:BaseTemplate.tt
错误2编译转换:类,结构或接口方法必须具有返回类型文件:BaseTemplate.tt
错误3编译转换:键入预期文件:BaseTemplate.tt
编译器说它们出现在BaseTemplate.tt的第一行,但我不认为这是真正的原因.
有人有这个问题吗?你知道我该怎么做才能解决它吗?
非常感谢你的时间,PK
在Visual Studio中,菜单命令"Build"=>"转换所有T4模板"是做什么的?
我编写了一个T4模板,我在其中实例化一个EF上下文来读取一些数据.问题是上下文无法从Web.config中看到连接字符串.
如何使Web.config中的连接字符串可用于模板?
更多信息:
试过下面的一些解决方案(谢谢),但我明白了:
Error 2 Compiling transformation: 'Microsoft.VisualStudio.TextTemplating12165CB53B43A726CBA54A29800255D257AAFD4D5F0DACE4DFE5872F2DEC7739EDF358F49C0444A912B851939903A79BC6180FCEB3FD0D1BF8C0093741DDDACA.GeneratedTextTransformation' does not contain a definition for 'Host' and no extension method 'Host' accepting a first argument of type 'Microsoft.VisualStudio.TextTemplating12165CB53B43A726CBA54A29800255D257AAFD4D5F0DACE4DFE5872F2DEC7739EDF358F49C0444A912B851939903A79BC6180FCEB3FD0D1BF8C0093741DDDACA.GeneratedTextTransformation' could be found (are you missing a using directive or an assembly reference?)
Run Code Online (Sandbox Code Playgroud)
我声明了以下内容:
<#@ assembly name="EnvDTE" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
Run Code Online (Sandbox Code Playgroud)
如果我包含Microsoft.VisualStudio.TextTemplating的程序集,它会告诉我它已经插入.
另外,有没有办法让ConfigurationManager对DbContext可用,这样他就可以在没有我传递连接字符串的情况下阅读他想要的幕后工作?
解决了它,再次感谢:
<#@ template hostspecific="true" language="C#" debug="false" #>
<#@ assembly name="System.Core.dll" #>
<#@ assembly name="System.Configuration" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
<#@ …Run Code Online (Sandbox Code Playgroud) 我的要求是根据DB中表中的值创建一个枚举.我正在使用ADO.NET实体框架模型(.edmx文件),任何人都可以帮助我.
我正在使用EDMX文件中的T4模板生成POCO(假设它们是MyEntityObject的子类).
我有3个实体,例如:
这些实体具有以下关系:
MyTable1.MyTable1ID <=> MyTable2.MyTable1ID(MyTable1ID是MyTable1的外键)
MyTable2.MyTable2ID <=> MyTable3.MyTable2ID(MyTable2ID是MyTable2的外键)
或者在另一种观点中:
MyTable1 <= MyTable2 <= MyTable3
我想提取所有外键关系
NavigationProperty[] foreignKeys = entity.NavigationProperties.Where(np => np.DeclaringType == entity && ((AssociationType)np.RelationshipType).IsForeignKey).ToArray();
forewach (NavigationProperty foreignKey in foreignKeys)
{
// generate code....
}
Run Code Online (Sandbox Code Playgroud)
我的问题:如何提取两个实体之间链接的列名?
像这样的东西:
void GetLinkedColumns(MyEntityObject table1, MyEntityObject table2, out string fkColumnTable1, out string fkColumnTable2)
{
// do the job
}
Run Code Online (Sandbox Code Playgroud)
在示例中
string myTable1Column;
string myTable2Column;
GetLinkedColumns(myTable1, myTable2, out myTable1Column, out myTable2Column);
Run Code Online (Sandbox Code Playgroud)
结果应该是
myTable1Column = "MyTable1ID";
myTable2Column …Run Code Online (Sandbox Code Playgroud) 运行生成器输出文件后,代码看起来真的很混乱.我知道我可能永远不会查看这些文件,但很高兴看到在开发生成器时生成的代码结构很好.
欢迎任何建议.
我正在Visual Studio 2010中编写T4模板,并根据项目中的现有类生成代码.我需要生成的代码取决于类实现的接口的泛型类型参数,但我没有看到通过Visual Studio核心自动化EnvDTE访问该信息的方法.以下是我需要分析的类的示例:
public class GetCustomerByIdQuery : IQuery<Customer>
{
public int CustomerId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
从这个定义我想生成代码(使用T4),如下所示:
[OperationContract]
public Customer ExecuteGetCustomerByIdQuery(GetCustomerByIdQuery query)
{
return (Customer)QueryService.ExecuteQuery(query);
}
Run Code Online (Sandbox Code Playgroud)
目前,我的T4模板中的代码看起来有点像这样:
CodeClass2 codeClass = GetCodeClass();
CodeInterface @interface = codeClass.ImplementedInterfaces
.OfType<CodeInterface>()
.FirstOrDefault();
// Here I want to do something like this, but this doesn't work:
// CodeClass2[] arguments = @interface.GetGenericTypeArguments();
Run Code Online (Sandbox Code Playgroud)
但是如何获得a的泛型类型参数CodeInterface?
我有一个T4模板,可以处理我项目中的几个.tt文件.我还有一些我定义的自定义类来帮助代码转换过程.
<#@ template language="C#" hostspecific="True" debug="True" #>
<#@ output extension="cs" #>
<#@ assembly name="System.Core.dll" #>
<#@ assembly name="$(TargetDir)\MyDependency.dll" #>
Run Code Online (Sandbox Code Playgroud)
这适用于Visual Studio,我有一个VS宏,它正确定义$(TargetDir).
现在,我想在构建过程中执行代码生成过程.我补充说:
<TransformOnBuild>true</TransformOnBuild>
<OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles>
<IncludeDslT4Settings>true</IncludeDslT4Settings> <ItemGroup>
<T4ReferencePath Include="$(OutputPath)" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" />
Run Code Online (Sandbox Code Playgroud)
我的构建运行,但我得到:
C:\ Program Files(x86)\ MSBuild\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets(407):主机在尝试解析程序集引用'$(TargetDir)\ MyDependency时抛出异常. DLL".转换不会运行.抛出以下异常:System.IO.FileLoadException:给定的程序集名称或代码库无效.(来自HRESULT的异常:0x80131047)System.Reflection.AssemblyName.nInit(RuntimeAssembly&assembly,Boolean forIntrospection,Boolean raiseResolveEvent)位于System.Reflection.AssemblyName.nInit()的Microsoft.VisualStudio.TextTemplating.GlobalAssemblyCacheHelper.GetLocation(String strongName)at at Microsoft.VisualStudio.TextTemplating.Sdk.Host.GenericTextTemplatingHost.Microsoft.VisualStudio.TextTemplating.Engine.ResolveAssemblyReferences(ITextTemplatingEngineHost主机,TemplateProcessingSession会话)中的ResolveAssemblyReference(String assemblyReference).Line = -1,Column = -1
显然它不会$(TargetDir)在Team构建上下文中解析.
我尝试将TargetDir添加到我的构建配置的属性组中,但无济于事.该值不会传递到T4代码生成器的上下文.
我不想使用环境变量.
如何$(TargetDir)在Team Build上下文中正确设置?
我们目前使用T4模板生成基于C#代码(实体POCO)和EDMX(在旧应用程序中)的C#代码文件
迁移到ASP.NET 5以支持跨平台开发,是否有任何代码生成工具可以读取项目类和元数据结构,并在设计时生成C#文件,类似于T4模板?