如何在 T4 中实例化 EF6 上下文?

Posted

技术标签:

【中文标题】如何在 T4 中实例化 EF6 上下文?【英文标题】:How to instantiate EF6 context in T4? 【发布时间】:2015-03-18 18:10:41 【问题描述】:

我想在 T4 模板中实例化一个新的 EF6 上下文,但出现以下错误:

System.InvalidOperationException:实体框架提供程序类型“System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework.SqlServer,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”的“Instance”成员未返回从“System.Data.Entity.Core.Common.DbProviderServices”继承的对象。实体框架提供者必须从此类继承,并且“实例”成员必须返回提供者的单例实例。

【问题讨论】:

【参考方案1】:

问题是无法实例化实体框架上下文,因为无法读取连接字符串。

我做了以下获取连接字符串:

var map = new ExeConfigurationFileMap();
map.ExeConfigFilename = this.Host.ResolvePath(@"..\..\Web.config");

var config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
var connectionString = config.ConnectionStrings.ConnectionStrings["BrainPerformEntities"].ConnectionString;

但请确保您已导入以下内容以使上述代码正常工作:

<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
<#@ import namespace="System.Configuration" #>
<#@ import namespace="System" #>

还要确保您已经引用了所有实体框架程序集:

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

<#@ assembly name="System.Core.dll" #>
<#@ assembly name="System.Configuration" #>
<#@ assembly name="System.Data.dll" #>

【讨论】:

以上是关于如何在 T4 中实例化 EF6 上下文?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确实例化 didChangeDependencies 中的 bloc?

如何在 EF Core 中实例化 DbContext

如何通过应用程序委托使用托管对象上下文实例化还原的视图控制器?

如何在 EaselJS / CreateJS 中实例化大型 MovieClip 而不会降低帧速率

在 EF6 中,是不是可以使用每个调用结构的上下文跨服务调用执行事务?

是否未指定在未评估的上下文中实例化模板/lambda?