如何在 T4 模板中使用 DbContext?

Posted

技术标签:

【中文标题】如何在 T4 模板中使用 DbContext?【英文标题】:How to use DbContext in T4 template? 【发布时间】:2016-11-01 09:09:10 【问题描述】:

我想使用 EntityFramework 生成一些带有 T4 模板的代码。我在与当前工作的 EF6 DbContext 相同的程序集中创建了一个 T4 模板:

<#@ template language="C#" hostspecific="true" debug="True" #>
<#@ assembly name="$(SolutionDir)\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll" #>
<#@ assembly name="$(TargetPath)" #>
<#@ import namespace="Conwell.Administration.Data.Entities" #>

<#
    using (var db = new KassenautomatEntities())
    
#>
//Hello World
<#
    
#>

当我运行它时,我得到以下执行:

运行转换:System.InvalidOperationException:

实体框架提供程序类型的“实例”成员 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer,版本=6.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089' 没有返回一个对象 继承自“System.Data.Entity.Core.Common.DbProviderServices”。 实体框架提供者必须从这个类和 'Instance' 成员必须返回提供者的单例实例。 这可能是因为提供者不支持 Entity Framework 6 或以后;见http://go.microsoft.com/fwlink/?LinkId=260882了解更多 信息。

相同的上下文在 T4 之外也能正常工作。我错过了什么?

【问题讨论】:

我想你必须在一个单独的程序集中定义一个KassenautomatEntities。然后在 T4 中可以使用这个程序集的引用。 从 VS2015 升级到 VS2017 后,我刚刚开始收到此错误。如果我在 VS2015 中运行相同的脚本,它就可以工作,所以我就是这样过日子的,但是 Christian 你有没有找到解决这个问题的方法?对于@AlexanderPetrov,我的 DbContext 类在一个单独的程序集中,在这里我已经证明模板是完整的,因为我在 VS2015 中使用它,所以在 VS2017 中生成代码的上下文中发生了什么变化 我不敢说,我用过普通的 ado.net @ChrisSchaller 【参考方案1】:

我遇到了同样的错误,让它工作的方法是:

    确保同时引用 EntityFramework 和您的提供程序 DLL 您的 T4 模板;这足以消除此错误。
<#@ assembly name="$(TargetDir)\EntityFramework.dll" #>
<#@ assembly name="$(TargetDir)\EntityFramework.SqlServer.dll" #>
    配置文件不会被读取,因为 T4 在不同的上下文中运行;因此您需要创建一个接受连接字符串的 DbContext 构造函数;然后在 T4 中创建上下文时传递它

【讨论】:

我在努力让实体框架通过 T4 模板与 Oracle 一起工作时遇到了这篇文章。仍在为这篇文章中的初始错误而苦苦挣扎。这似乎适用于 MSSQL,但不适用于 Oracle。有什么建议可以给我吗? @PaulSinnema 这个错误是关于缺少引用的,你引用了oracle dll吗?即 Oracle.ManagedDataAccess.EntityFramework,还要确保引用所有需要的 dll。

以上是关于如何在 T4 模板中使用 DbContext?的主要内容,如果未能解决你的问题,请参考以下文章

使用 t4 Scaffolding 在 mvc4 中获取模型(TableName)的元数据

PetaPoco的T4模板报错的问题

如何从 PowerShell 脚本触发 T4 模板

如何使用从解决方案中现有基类继承的 T4 模板生成类?

如何在 Visual Studio For Mac 中执行 T4 模板文件?

如何在构建时在 Blazor 项目中运行 T4 模板