我想使用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'。
  实体框架提供者必须继承此类,并且
  “实例”成员必须返回提供者的单例实例。
  这可能是因为提供程序不支持实体框架6
  或以后;有关更多信息,请参见http://go.microsoft.com/fwlink/?LinkId=260882
  信息。


在T4之外,相同的上下文也可以正常工作。我缺少什么?

最佳答案

我遇到了同样的错误,使其正常工作的方法是:


确保同时引用EntityFramework和您的提供程序DLL
您的T4模板;这足以消除此错误。



<#@ assembly name="$(TargetDir)\EntityFramework.dll" #>
<#@ assembly name="$(TargetDir)\EntityFramework.SqlServer.dll" #>




由于T4在不同的上下文中运行,因此不会读取配置文件。因此,您需要创建一个接受连接字符串的DbContext构造函数;然后在T4中创建上下文时将其传递

关于c# - 如何在T4模板中使用DbContext?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38103322/

10-13 01:13