如何在T4模板中使用DbContext?

3

我想使用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: “Instance”成员来自Entity Framework提供程序类型 “System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer,Version=6.0.0.0,Culture=neutral, PublicKeyToken=b77a5c561934e089”的返回对象未继承自 “System.Data.Entity.Core.Common.DbProviderServices”。Entity Framework提供程序必须从此类继承, 并且“Instance”成员必须返回提供程序的单例实例。 这可能是因为提供程序不支持Entity Framework 6或更高版本; 有关更多信息,请参见http://go.microsoft.com/fwlink/?LinkId=260882
在T4之外,相同的上下文正常工作。 我缺少什么?

我想你需要在一个单独的程序集中定义一个 KassenautomatEntities。然后可以在 T4 中引用这个程序集。 - Alexander Petrov
我升级到VS2017之后刚开始出现了这个错误。如果我在VS2015中运行相同的脚本,它就可以正常工作,所以这是我一直维持下去的方式,但是Christian你有没有找到解决方法呢?至于@AlexanderPetrov,我的DbContext类是在单独的程序集中,我已经证明了模板的完整性,因为我在VS2015中使用它,所以在VS2017中生成代码时上下文发生了什么变化? - Chris Schaller
很抱歉,我不得不说,我使用了普通的ado.net @ChrisSchaller - Christian Gollhardt
1个回答

1

我曾经遇到过同样的错误,解决方法是:

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

在我努力让Entity Framework与T4模板一起使用Oracle时,我看到了这篇文章。仍然在努力解决此文章中的初始错误。这对于MSSQL似乎可以正常工作,但对于Oracle则不行。你能给我任何建议吗? - Paul Sinnema
@PaulSinnema 这个错误是关于缺少引用的,你是否引用了Oracle的dll?即Oracle.ManagedDataAccess.EntityFramework,还要确保引用了所有需要的dll。 - Mahmoud Hanafy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接