3

我已将 Visual Studio Entity Framework 5.0 包含文件 (EF.Utility.CS.ttinclude) 中的类转换为一组标准 C# 类。我为什么这样做并不重要,只要说我有充分的理由这样做就足够了,并且没有其他方法可以完成我希望完成的事情。尝试通过提供的 t4 模板(为 EF 生成标准 DbContext 的模板)测试类时,我收到以下错误:


Error   1   Running transformation: System.IO.FileNotFoundException: Could not load file or assembly 'EFUtilities_5_0_DeConstruct, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
File name: 'EFUtilities_5_0_DeConstruct, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
   at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection)
   at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.Load(String assemblyString)
   at System.UnitySerializationHolder.GetRealObject(StreamingContext context)
   at System.IServiceProvider.GetService(Type serviceType)
   at EFUtilities_5_0_DeConstruct.EntityFrameworkTemplateFileManager.Create(Object textTransformation) in c:\Users\Sam\Documents\Visual Studio 2012\Projects\EFExplorer_5\EFUtilities_5_0_DeConstruct\EntityFrameworkTemplateFileManager.cs:line 29
   at Microsoft.VisualStudio.TextTemplating6F3E7F749A9B7F1589040546E2B00865752CC91ED5490722E3718CB7A5DDD503FF97964710FBB3EBF135630FF50F8F2A8EA8FA5AA531EC2449158E3D60FD019D.GeneratedTextTransformation.TransformText()

此错误发生在 Visual Studio 2012 Premium 创建项目后添加了标准实体框架数据项目并生成了从数据库构建的模型(数据库有一个没有什么特别之处的表 - 主键,几个测试列)选择 Build|Transform all T4 菜单选项(仅在选择 Model1.tt 文件并选择“Run Custom Tool”时也会发生)。Model1.tt(名称是默认分配的)文件是失败的文件,Model1.Context.tt 文件执行得很好。两个模板都已修改,因此它们包含与 EF.Utility.CS.ttinclude 文件相同的程序集和导入子句(实际上是剪切和粘贴)以及对存储结果类的 DeConstruct 程序集的附加引用。解决方案编译到“Debug”中的标准调试位置,编译到“Release”的生产目录 (C:\T4\EF_5_0\Assembiles)。我尝试将 Model1.tt 文件设置为指向这两个位置,但我得到了同样的错误。

错误所指出的违规行是: DTE dte = (DTE)hostServiceProvider.GetService(typeof(DTE));

envDTE 程序集被添加到引用和类的 using 子句中。

所有这一切的关键是,我已经使用 EF 4.3.1 EF.Utility.CS.ttinclude 文件和 Visual Studio 2010 中相应的 4.3 DbContext 生成器文件成功地完成了这项工作。工作正常,对基本类进行了扩展,等等所以...关于为什么我可能会在 VS2012 和 EF 5.0 中看到这个错误的任何线索?我没有尝试过的一件事是将 EF 5.0 带入 VS2010 环境。有点不想污染工作环境。

4

1 回答 1

1

找到了答案:

选择哪个版本的EnvDTE无关紧要(GAC中的版本,显示为“envdte”或VS2012本地的版本,显示为“EnvDTE”。将任一版本添加到项目中,然后,添加后,对(关闭)单击引用列表中的程序集名称(“EnvDTE”或“envdte”),选择“属性”并将属性“嵌入互操作类型”设置为 false 并重新构建。这对我有用。

于 2012-11-26T07:35:02.623 回答