Entity Framework 6 t4 代码生成在 VS2022 中不起作用?

url*_*der 19 .net c# entity-framework visual-studio visual-studio-2022

我有一个旧项目,是在 .NET 4.5 上使用 VS2019 和 Entity Framework 6 构建的。我们首先使用数据库来生成代码。效果非常好。

\n

但是,我们刚刚开始使用 VS2022 V17.6.2,我需要使用新表更新应用程序,因此,我将表添加到model.edmx,运行.tt文件,令我惊讶的是,它显示了如下错误:

\n
\n
Error     \nRunning transformation: System.NullReferenceException: Object reference not set to an instance of an object.\n\nat Microsoft.VisualStudio.TextTemplatingD21DB4521EFD493FAE41A9CE9DA80C875F3084552987498BD518713BDE91D14AF116D5B591FBF7D992E37AB98D0755C27E1BD3D907AED6618E5F11743F78068A.GeneratedTextTransformation.DynamicTextTransformation.get_GenerationEnvironment() in C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE\\Extensions\\Microsoft\\Entity Framework Tools\\Templates\\Includes\\EF6.Utility.CS.ttinclude:line 1928\n   at Microsoft.VisualStudio.TextTemplatingD21DB4521EFD493FAE41A9CE9DA80C875F3084552987498BD518713BDE91D14AF116D5B591FBF7D992E37AB98D0755C27E1BD3D907AED6618E5F11743F78068A.GeneratedTextTransformation.EntityFrameworkTemplateFileManager..ctor(Object textTransformation) in C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE\\Extensions\\Microsoft\\Entity Framework Tools\\Templates\\Includes\\EF6.Utility.CS.ttinclude:line 1665\n   at Microsoft.VisualStudio.TextTemplatingD21DB4521EFD493FAE41A9CE9DA80C875F3084552987498BD518713BDE91D14AF116D5B591FBF7D992E37AB98D0755C27E1BD3D907AED6618E5F11743F78068A.GeneratedTextTransformation.EntityFrameworkTemplateFileManager.VsEntityFrameworkTemplateFileManager..ctor(Object textTemplating) in C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE\\Extensions\\Microsoft\\Entity Framework Tools\\Templates\\Includes\\EF6.Utility.CS.ttinclude:line 1784\n   at Microsoft.VisualStudio.TextTemplatingD21DB4521EFD493FAE41A9CE9DA80C875F3084552987498BD518713BDE91D14AF116D5B591FBF7D992E37AB98D0755C27E1BD3D907AED6618E5F11743F78068A.GeneratedTextTransformation.EntityFrameworkTemplateFileManager.Create(Object textTransformation) in C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE\\Extensions\\Microsoft\\Entity Framework Tools\\Templates\\Includes\\EF6.Utility.CS.ttinclude:line 1629\n   at Microsoft.VisualStudio.TextTemplatingD21DB4521EFD493FAE41A9CE9DA80C875F3084552987498BD518713BDE91D14AF116D5B591FBF7D992E37AB98D0755C27E1BD3D907AED6618E5F11743F78068A.GeneratedTextTransformation.TransformText() in C:\\test\\Code\\ConsoleAppTest\\TestModel.tt:line 10   Miscellaneous Files C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE\\Extensions\\Microsoft\\Entity Framework Tools\\Templates\\Includes\\EF6.Utility.CS.ttinclude 1928    \n
Run Code Online (Sandbox Code Playgroud)\n
\n

所以我将新.tt文件与旧文件进行了比较,发现有一些变化,例如,它EF.Utility.CS.ttinclude不是EF6.Utility.CS.ttinclude. 所以我尝试了之前的方法,在 VS2022 中仍然出现同样的错误。

\n

我尝试应用最新的实体6.4.4,改用.net Framework 4.8,还是一样。尝试调试T4模板,仍然是同样的错误。

\n

Visual Studio 的屏幕截图。 一行代码引发错误。 代码如下: public StringBuilder GenerationEnvironment { get { { return (StringBuilder)_ GenerationEnvironment.GetValue(_instance, null);  } }。 悬停文本中出现的错误显示为“异常抛出”。 System.NullReferenceException:\xe2\x80\x98对象引用未设置到对象的实例。\xe2\x80\x99 _ GenerationEnvironment 为 null。

\n

现在,我必须为新添加的表手动创建代码。有解决办法吗?这是否意味着我们不能再在 VS2022 for Entity Framework 6 for .NET Framework 4.8(或更低版本)中使用代码生成?

\n

Luc*_*ssa 45

这是 Visual Studio 2022 v17.6+ 的一个已知错误

正如 @urlreader 所写,目前 Microsoft 开发人员社区存在一个未解决的问题,并且可以在此处此处找到解决方法,等待补丁。

解决方法告诉:

  1. 编辑文件EF6.Utility.CS.ttinclude(您可能需要编辑EF.Utility.CS.ttinclude,如果您在 VisualBasic 中进行开发,请考虑这些文件的“.VB.”版本),可在此处找到

C:\ Program Files \ Microsoft Visual Studio \ 2022 \ Professional \ Common7 \ IDE \ Extensions \ Microsoft \ Entity Framework Tools \ Templates \ Includes

  1. 搜索以下字符串

私有DynamicTextTransformation(对象实例)

  1. 将_ GenerationEnvironment的设置替换为

_ GenerationEnvironment = type.GetProperty("GenerationEnvironment", BindingFlags.Instance | BindingFlags.NonPublic);

  1. 对此

_ GenerationEnvironment = type.GetProperty("GenerationEnvironment");

  1. 现在您可以重试。

  • 谢谢你!刚刚更新到 VS 17.6,我以为我疯了。 (3认同)