如何在T4模板中使用DbContext?

时间:2016-06-29 15:00:01

标签: c# entity-framework dbcontext t4

我想使用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:

     

&#39;实例&#39;实体框架提供程序类型的成员   &#39; System.Data.Entity.SqlServer.SqlProviderServices,   EntityFramework.SqlServer,Version = 6.0.0.0,Culture = neutral,   公钥= b77a5c561934e089&#39;没有返回一个对象   继承自System.Data.Entity.Core.Common.DbProviderServices&#39;。   实体框架提供者必须从这个类继承   &#39;实例&#39;成员必须返回提供者的单例实例。   这可能是因为提供者不支持实体框架6   或以后;有关详情,请参阅http://go.microsoft.com/fwlink/?LinkId=260882   信息。

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

1 个答案:

答案 0 :(得分:1)

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

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