在Visual Web Developer Express 2008中,SubSonic ASP.NET MVC模板似乎不适用于我添加的新数据库.我删除了Chinook数据库并创建了自己的数据库.我理解Models文件夹中的.tt文件用于生成代码,但它们没有(尽管将ConnectionStringName更改为我在web.config中设置的内容)
右键单击每个.tt文件并选择"运行自定义工具"不会生成任何内容,除了错误消息:
Cannot find custom tool 'TextTemplatingFileGenerator' on this system.
Run Code Online (Sandbox Code Playgroud)
这个工具在哪里保存?CodeTemplates中有.tt文件,它们在您创建新控制器或视图时使用,因此我假设有一个工具可以执行此操作.
我想开始编写T4模板.我听说过很多关于这些模板的东西(主要是在Hanselminutes播客中),并且想了解更多.有关T4模板编写信息的最佳位置是什么?开始实现自己的模板需要什么?我应该知道是否存在陷阱或重要事项?
在我的应用程序中,我们有一个跟踪记录器.我们在跟踪方法名称和参数值的大多数重要方法的开头和结尾添加了日志语句.现在这些跟踪语句使代码膨胀,阅读它们有点痛苦.
我正在考虑如何将代码的这一方面与业务逻辑分开.
今天我读到了Unity的拦截框架.如果可以使用通用记录器拦截我的方法调用并记录方法名称和参数值,我有一个想法.我不确定是否可以使用反射读取方法参数.Unity可以像这样使用吗?
另一个想法是运行T4代码生成引擎,在用特定属性修饰的所有方法的开头和结尾生成日志记录语句.由于我对T4知之甚少,有谁知道这是否可以实现?
有没有其他方法可以将日志记录代码与业务逻辑分开?
干杯,Unmesh
我正在使用此线程中发布的模板从包含我的DAL的类库中的SQL Server中的几个查找表生成C#枚举.
目前,我已经将模板所使用的连接字符串嵌入到类库中的模板包含文件中.有没有一种方便的方法让模板从主项目(WAP)的web.config中获取连接字符串而不必包含物理路径?或者有更好的方法来解决这个问题吗?
编辑
我还考虑创建一个SQL CLR程序集,它返回一个包含枚举内容的表值函数(然后在C#中定义,而不是在数据库中定义),但我不确定性能是什么.它是否显着显然会依赖于应用程序,但是如果它是一个知道最好的 - 避免 - 这种方法,我讨厌收费.
我正在尝试使用自定义T4模板将新控制器添加到MVC 3项目中.我有自己的模板,Scott Hanselman在http://www.hanselman.com/blog/ModifyingTheDefaultCodeGenerationscaffoldingTemplatesInASPNETMVC.aspx上写道,但我有兴趣在MvcTextTemplateHost类中挖掘更多,看看它提供了什么,所以我们可以自定义我们的控制器,看看它如何与"添加控制器..."对话框进行交互.
但是我找不到(在搜索谷歌之后,当然......)对这个类的引用,也没有MSDN或者任何其他MS站点...任何想法?
谢谢,塞尔吉
我看,我没有看到.
我有一个包含两个项目的解决方案 - 项目A(库)和项目B,它是主项目,包含T4文本模板.
到目前为止我做了什么 - 我在主项目中添加了一个项目A的引用.我在模板中包含了这样的行:
<#@ import namespace="MyProjectA" #>
Run Code Online (Sandbox Code Playgroud)
然而,仍然存在错误"编译转换:找不到类型或命名空间名称'MyProjectA'(您是否缺少using指令或程序集引用?)"
问题:如何从文本模板引用项目A?
请注意:我想在解决方案中引用一个项目,而不是磁盘上的dll文件.
我有一个C#regex-parser程序,里面有三个文件,每个文件都包含一个静态类:
1)一个填充字符串字典的静态类
static class MyStringDicts
{
internal static readonly Dictionary<string, string> USstates =
new Dictionary<string, string>()
{
{ "ALABAMA", "AL" },
{ "ALASKA", "AK" },
{ "AMERICAN SAMOA", "AS" },
{ "ARIZONA", "AZ" },
{ "ARKANSAS", "AR" }
// and so on
}
// and some other dictionaries
}
Run Code Online (Sandbox Code Playgroud)
2)将这些值编译为正则表达式的类
public static class Patterns
{
Public static readonly string StateUS =
@"\b(?<STATE>" + CharTree.GenerateRegex(Enumerable.Union(
AddrVals.USstates.Keys,
AddrVals.USstates.Values))
+ @")\b";
//and some more like these
}
Run Code Online (Sandbox Code Playgroud)
3)一些基于这些字符串运行正则表达式的代码:
public static class Parser
{ …Run Code Online (Sandbox Code Playgroud) 我在Visual Studio中有一个网站项目,我正在尝试从站点的bin目录中引用一些程序集.
到目前为止,根路径是唯一有效的路径:
<#@ Assembly Name="C:\Code\Web Solution\Website\bin\My.dll" />
Run Code Online (Sandbox Code Playgroud)
其他人提到使用msbuild变量,但这对我不起作用:
<#@ Assembly Name="$(SolutionDir)Website\bin\My.dll" />
Run Code Online (Sandbox Code Playgroud)
而且我很确定相对路径只是平坦无法工作(我的tt文件位于App_Code的子文件夹中):
<#@ Assembly Name="..\..\bin\My.dll" />
Run Code Online (Sandbox Code Playgroud)
如果不使用root路径,有没有办法在网站项目的上下文中使这个工作?
我最近切换到Entity Framework 5.现在,我想从现有数据库生成POCO类,我还需要延迟加载和更改跟踪.因此,所有标量属性都应该是虚拟的以及导航属性.
添加新的ADO.Net实体数据模型以.edmx文件和其他一些.cs和.tt文件结尾.
首先,我想知道为什么生成的POCO类默认不符合变更跟踪代理的要求,即标量属性不是虚拟的.
其次,如何生成支持代理的poco类?
PS:我接受了Slauma的答案是迄今为止最好和唯一的答案,但我不同意它的第一部分.这是我的论点
Slauma讨论了代理的两个问题:限制和性能:
关于启用代理的实体的限制:当实体框架在DB First方法中生成类时,类必须遵循以启用更改跟踪代理的规则并不是那么重要,因为它们根本不是限制性的.谁真正关心导航集是IList还是HashSet?只有当应用程序中存在perior设计类并且要从中生成表时,才能理解这些限制.
DB首先不支持复杂属性.所以我们可以将它们从讨论中排除.
关于性能:在所讨论的文章以及我迄今为止研究的其他一些实验中,结果并不是非常有说服力地拒绝代理以支持快照.首先,实验是在大量实体(即10,000)上完成的.应用程序(不在数据库中)中的批处理过程对大量实体起作用并不是不可能的,但是假设有更好的方法,例如存储过程.其次,根据应用程序的类型和需求,我们通常会处理少量的entites,例如当Repository模式被强制使用时; 代理和快照的性能没有区别.有趣的是,在已解决的实验中,重新为属性重新分配相同的值是代理性能显着失败的唯一情况.但谁真的这样做?小心避免反复通知更改跟踪器非常容易.同样,在这种情况下,当处理大量的entites时会出现重大问题.
我在构建时使用T4转换有困难(使用MsBuild).
我正在尝试将生成的文件添加到解决方案/项目中.如果我只保存或运行自定义工具,则会生成文件,并自动添加到解决方案中.
这些文件也是在构建时生成的,但不会"开箱即用"地添加到解决方案中.我不确定,如果这是我的错,或默认行为.
我也无法将生成的文件名生成到模板中.
我能够在构建输出中看到生成的文件,但是将它们作为参数传递给.tt文件是不成功的.
以下是.csproj的外观:
<Import Project="$(VSToolsPath)\TextTemplating\Microsoft.TextTemplating.targets" />
<PropertyGroup>
<TransformOnBuild>true</TransformOnBuild>
<OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles>
<TransformOutOfDateOnly>false</TransformOutOfDateOnly>
<AfterTransform>OnAfterTransform</AfterTransform>
</PropertyGroup>
<Target Name="OnAfterTransform">
<Message Text="@(GeneratedFiles)" Importance="high" />
<ItemGroup>
<T4ParameterValues Include="Generated">
<Value>@(GeneratedFiles)</Value>
<Visible>false</Visible>
</T4ParameterValues>
</ItemGroup>
</Target>
Run Code Online (Sandbox Code Playgroud)
并建立输出:
==========构建:1成功,0失败,0最新,0跳过==========
<#@ parameter type="System.Collections.Generic.List<string>" name="Generated" #>
<#@ parameter type="System.String" name="Generated" #>
<#@ parameter type="System.String" name="GeneratedFiles" #>
Run Code Online (Sandbox Code Playgroud)
...我无法将这些文件名转换为.tt文件.我真的不知道我应该为参数使用什么类型.从Oleg的页面和其他人,我无法确定参数的类型.我也没有通过谷歌搜索找到相关的例子.
另一方面,我可以轻松传递ProjectFolder,例如:
<ItemGroup>
<T4ParameterValues Include="ProjectFolder"> …Run Code Online (Sandbox Code Playgroud)