T4模板调试正常,但在正常运行模式下出错

时间:2015-12-16 06:15:45

标签: c# asp.net .net entity-framework t4

我从头开始创建了一个T4模板来生成DTO类。直到昨天,它按预期运行,直到我添加了对DbContext类的调用,如下所示:

using (var context = new TenantDbContext())
{
    var entityObjects = ((IObjectContextAdapter) context).ObjectContext.MetadataWorkspace.GetItems<EntityType>(DataSpace.OSpace);

    // Processing...
}

现在,当通过保存模板构建或由项目构建触发模板构建时,它会因以下错误而停止:

Running transformation:
System.EntryPointNotFoundException: Entry point was not found.    at
System.Data.Entity.Infrastructure.IObjectContextAdapter.get_ObjectContext()
at
Microsoft.VisualStudio.TextTemplating4060E50565D24E6D60BA3E80DDCE2A21E9485A5F4982CD591645549489576DC7687B06DE6C675CAA51175F177B32340E9E07C1C8B0487B2BD65D022D75892D00.GeneratedTextTransformation.TransformText()

奇怪的是,当我调试模板时,它工作正常!我还没有找到原因,并且找不到其他类似问题的人。任何建议将不胜感激。

此文件的导入如下:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ Assembly Name="System.Data" #>
<#@ assembly name="System.Data.Entity.Design" #>
<#@ assembly name="$(SolutionDir)packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll" #>
<#@ assembly name="$(SolutionDir)packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll" #>
<#@ assembly name="$(SolutionDir)ProjectName.Enties\bin\Debug\ProjectName.Enties.dll" #>
<#@ assembly name="$(SolutionDir)HouseOfSynergy.PowerTools.Library\bin\Debug\HouseOfSynergy.PowerTools.Library.dll" #>
<#@ assembly name="$(SolutionDir)ProjectName\bin\Debug\ProjectName.DataLayer.dll" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Collections.ObjectModel" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.Entity.Core.Metadata.Edm" #>
<#@ import namespace="System.Data.Entity.Core.Objects" #>
<#@ import namespace="System.Data.Entity.Design.PluralizationServices" #>
<#@ import namespace="System.Data.Entity.Infrastructure" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="ImagineCapture.Enties" #>
<#@ import namespace="ImagineCapture.DataLayer" #>
<#@ import namespace="ImagineCapture.DataLayer.Contexts" #>
<#@ output extension=".cs" #>

我知道所有引用的程序集都存在于其指定的路径上,并且所有程序集都是最新构建的。它在调试时确实有效。

环境:

  • VS 2013 Ultimate
  • ASP .NET Web App
  • 实体框架6.3.1
  • .NET 4.5
  • Windows 8.1(64位)

1 个答案:

答案 0 :(得分:0)

T4模板在同一解决方案中引用了一个项目(尽管在构建周期的早期出现了一个项目)。

使用'Debug'解决方法一段时间后,我想到了两个原因:

  • 正常运行模板时,T4主机会在VS构建周期释放之前尝试获取对引用程序集的锁定。
  • Debug中运行模板时,T4主机有足够的时间获取所需的锁,但无法执行以下操作:(1)触发内部垃圾回收以释放引用的程序集,或者:(2)无法作为进程本身终止(虽然我不认为它是任务管理器中的单独进程)。