我经常不使用T4模板; 通常在我这样做时正在编辑其他项目(特别是SubSonic和T4MVC).经验总是令人不快(这也是我不经常使用它们的原因).
这些是我所知道的工具,它们都不符合要求.
我第一次尝试使用它时,我认为Visual Studio 2010已经崩溃了.结果我没等多久(编辑器窗口出现花了2分多钟).叫我挑剔,但这一点让我脱离了这个工具.
我有一个修改过的T4MVC模板.安装Tangible的T4编辑器后,模板失败并出现多个错误.如果我然后卸载Tangible的T4编辑器,模板将再次运行.因此,编辑器会改变Visual Studio中T4的行为.也许显然,这是完全不可接受的.
我错过了还有其他T4编辑吗?是否有其他人使用这些工具,遇到这些相同的问题,并成功使用它们?
我还应该说,对我来说最重要的功能就是区分作为模板一部分运行的代码和获得输出的代码/文本.其他一切都是肉汁.
我在EF 4.0中自定义我的.tt文件.现在作为自定义的一部分,我需要在POCO类生成中向属性添加一些代码,如果属性类型是Nullable<System.DateTime>或System.DateTime.我无法找到适当的比较语法.
我在.tt文件中有以下代码.
foreach (EdmProperty edmProperty in entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity))
{
bool isDefaultValueDefinedInModel = (edmProperty.DefaultValue != null);
//Here I need to check whether my edmProperty is Nullable<System.DateTime> or System.DateTime, so that I can insert custom code.
}
Run Code Online (Sandbox Code Playgroud)
请帮忙.
是否可以编写t4模板(或者如果它已经存在),它将能够根据*.edmx文件中的数据生成DTO类?
我必须为当前项目编写DTO类,这个过程有点令人讨厌.
我想要获得的是获得DTO类,它将标量属性定义为简单的自动属性,导航参数作为其他DTO类的封装实例.
示例:
public class SomeClassDTO
{
public byte Id { get; set; }
public string Description { get; set; }
public OtherClassDTO SomeProperty {get;set;}
public IList<AnotherClassDTO> Objects {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
这是一个很好的起点,更令人满意的可能是以下示例:
/// <summary>
/// Employee details DTO.
/// </summary>
public class EmployeeDetailsDTO
{
[Key]
public long Id { get; set; }
[Required]
public string FirstName { get; set; }
[Required]
public string Surname { get; set; }
...
public long? PhotoId { get; set; }
// Home address properties. …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试迭代我的所有项目(sharepoint)以将所有功能guid放入文件中.我想在它们前面加上项目名称.我的问题是DTE.Solution.Item和DTE.Solution.Projects.Item(或foreach的枚举器)不会将整数作为参数,foreach返回一个不能转换为Project的对象.
这是我的代码片段:
var hostServiceProvider = (IServiceProvider) Host;
var dte = (DTE) hostServiceProvider.GetService(typeof(DTE));
var projectCount = dte.Solution.Projects.Count;
var projects = new Dictionary<string, string>();
foreach(Project dteProject in dte.Solution)
{
var dteProject = dte.Solution.Item(i);
projects.Add(dteProject.Name, dteProject.FullName);
}
Run Code Online (Sandbox Code Playgroud)
好的 - 代码没问题 - 调试器不是!抛出调试上下文的我的异常,但如果没有附加调试器,模板将运行正常.
如何指示T4模板生成具有给定文件名的结果文件?
我会试着更清楚.假设我有一个名为Insert.tt的模板,它生成代码以将记录插入表中.它的输出扩展名为"sql",因此它创建了一个名为的文件:
Insert.sql
没关系,但是我希望文件名可以反映我正在尝试做的事情.假设我正在生成Insert for的表的名称存储在<#= TableName#>中.我想将它传递给模板生成器并让它使用它来保存生成的文件.
即<#SaveTemplateAs("Insert"+ TableName); #>
因此,假设我为表User,Address和Phone生成Insert语句.
我希望生成的文件名为InsertUser.sql,InsertAddress.sql和InsertPhone.sql.
我很确定这可以完成,因为我已经看到一些自定义扩展从单个模板生成多个文件,但我不理解一种简单(不过度杀伤)的方式来实现这一点.
谢谢
我想使用T4生成片段,但在将.tt文件添加到Wix项目后,此文件没有"自定义工具"选项.右键单击.tt文件时没有菜单项"运行自定义工具".
这有什么黑客攻击吗?我正在使用VS 2010和最新的Wix 3.5
有没有人知道是否有可能从VS2010内的另一个T4模板运行T4模板文件
谢谢
我有一个相当复杂的东西塞进T4模板.基本上我采取类似的东西
{= foo =}更多文字...
并将其转换为类(视图),如下所示:
public class MyView
{
public string foo{get;set;}
public string Write()
{
return foo+@" more text...";
}
}
Run Code Online (Sandbox Code Playgroud)
生成的代码当然要复杂得多.无论如何,T4模板现在超过600行代码,并且真正变得难以管理.我认为主要问题是混合代码和"内容"(即静态代码).我不确定如何干净地解决这个问题(当然不会影响生成的代码).我也没有看到任何可行的单元测试我的T4代码的方法,除了简单地测试它的T4执行错误.当然,似乎几乎不可能测试它生成的代码.
我可以使用任何"模型 - 视图"类型的框架或技术来使我的T4模板代码更干净吗?
我使用EF 5和Model First方法创建了一个EDMX,即我从一个空白设计师开始并模拟我的实体.现在,我希望能够使用EDMX中定义的此模型,但提供运行时SQL Server连接字符串,而无需修改配置文件.
我知道如何将连接字符串传递给DbContext,但问题是找到程序集中映射的元数据.
例如,我的EDMX在app.config中有这个连接字符串
<add name="MesSystemEntities" connectionString="metadata=res://*/Data.DataContext.EntityFramework.MesSystem.csdl|res://*/Data.DataContext.EntityFramework.MesSystem.ssdl|res://*/Data.DataContext.EntityFramework.MesSystem.msl;provider=System.Data.SqlClient;provider connection string="data source=MyMachine;initial catalog=MesSystem;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)
我失踪的部分是 "metadata=res://*/Data.DataContext.EntityFramework.MesSystem.csdl|res://*/Data.DataContext.EntityFramework.MesSystem.ssdl|res://*/Data.DataContext.EntityFramework.MesSystem.msl;"
我希望能够以DbContext编程方式创建一个SQL Server连接字符串,但"添加"元数据部分.
这就是我希望T4文件生成的内容......
public partial class MesSystemEntities : DbContext
{
public MesSystemEntities()
: base("name=MesSystemEntities")
{
}
public MesSystemEntities(string sqlServerConnectionString)
: base(GetEfConnectionString(sqlServerConnectionString))
{
}
private string GetEfConnectionString(string sqlServerConnectionString)
{
// values added by T4 generation
string format = "metadata=res://*/Data.DataContext.EntityFramework.MesSystem.csdl|res://*/Data.DataContext.EntityFramework.MesSystem.ssdl|res://*/Data.DataContext.EntityFramework.MesSystem.msl;;provider=System.Data.SqlClient;provider connection string=\"{0}\"";
return String.Format(format, sqlServerConnectionString);
}
...
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何在T4生成文件中获取我需要的元数据来创建实体框架连接,而无需为每个EDMX文件对其进行硬编码
要么
是否有更简单的方法以编程方式从程序集加载元数据?
当我使用EF Power Tools逆向工程生成上下文时,它在我的数据库名称的文件中创建了一个带有我的数据库名称的类.我能够修改T4模板以使用Context类名称的静态名称.但是,我想在类的文件名中使用相同的静态名称.我怎样才能做到这一点?