我不知道是否有可能,但是,您可以将 T4 脚本放在一个单独的项目中,并使用 MSBuild 任务将您生成的文件复制到您的 EF 实体项目中。
您的解决方案应包含
- 您的 EF 实体项目,我们称之为实体
- 一个实体生成器项目(你将把你的 T4 脚本放在这里),例如称之为EntitiesGenerator
您还需要为自定义 MSBuild 任务创建一个项目,该任务会将您生成的 C# 文件复制到您的“实体”项目中
为此,请创建一个类库项目MyBuildProcess
参考以下程序集:
- Microsoft.Build.Framework(位于 C:\Windows\Microsoft.NET\Framework\v4.0.30319)
现在,让我们编写自定义任务向您的项目添加一个类文件,例如 CopyGeneratedEntities.cs
using System;
using Microsoft.Build.Framework;
using System.IO;
namespace MyBuildProcess
{
public class CopyGeneratedEntities : ITask
{
private IBuildEngine _buildEngine;
public IBuildEngine BuildEngine
{
get { return _buildEngine; }
set { _buildEngine = value; }
}
private ITaskHost _hostObject;
public ITaskHost HostObject
{
get { return _hostObject; }
set { _hostObject = value; }
}
public bool Execute()
{
// Copy generated Product entity to EF project
if (File.Exists(@"C:\MySolution\EntitiesGenerator\ProductEntity.cs"))
{
File.Copy(@"C:\MySolution\EntitiesGenerator\ProductEntity.cs",
@"C:\MySolution\Entities\ProductEntity.cs", true);
}
return true;
}
}
}
构建你的项目
现在编辑与您的 T4 项目 ( EntitiesGenerator ) 相对应的.csproj文件,并通过在标签下方添加以下内容来引用自定义任务:<Project ... >
<UsingTask AssemblyFile="C:\MySolution\Libs\MyBuildProcess.dll"
TaskName="MyBuildProcess.CopyGeneratedEntities" />
并像这样调用任务(在 csproj 文件的末尾,在 之前</Project>
):
<Target Name="AfterBuild">`
<CopyGeneratedEntities />
</Target>
现在,当您构建EntitiesGenerator项目时,T4 会呈现您的实体,并且一旦构建结束,您的自定义任务就会被调用,并且您的文件会被复制到您的“实体”项目中。
您只需要在第一代之后手动将生成的 C# 文件引用到您的实体项目,然后它们就会被简单地覆盖。
有关 MSBuild 的更多信息,请参阅。
MSBuild 团队博客 - 如何:实施自定义任务
Microsoft.Build 命名空间