2016-06-29 122 views
2

我想使用EntityFramework生成一些帶有T4模板的代碼。我在同一個大會創造了一個T4模板,我目前工作EF6的DbContext:如何在T4模板中使用DbContext?

<#@ 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 
<# 
    } 
#> 

當我運行它,我得到以下execption:

運行改造信息:System.InvalidOperationException:

實體框架提供程序類型的「實例」成員 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer,Version = 6.0.0.0,Culture = neutral, PublicKeyToken = b77a5c56193 '4e089'沒有返回從'System.Data.Entity.Core.Common.DbProviderServices'繼承的對象 。 實體框架提供者必須繼承此類,並且 「實例」成員必須返回提供者的單例實例。 這可能是因爲提供程序不支持實體框架6 或更高版本;有關更多 的信息,請參閱http://go.microsoft.com/fwlink/?LinkId=260882

相同的上下文在T4以外工作正常。我錯過了什麼?

+0

我想您必須在單獨的程序集中創建一個'KassenautomatEntities'定義。然後參考這個程序集可以在T4中使用。 –

+0

從VS2015升級到VS2017後,我剛剛開始出現此錯誤。如果我在VS2015中運行相同的腳本,它的工作原理就是這樣,所以我一直在這樣做,但基督徒你是否曾經發現過這個問題的解決方法?並且@AlexanderPetrov我的DbContext類在一個獨立的程序集中,在這裏我已經證明模板是完整的,因爲我在VS2015中使用它,所以VS2017中生成的代碼在上下文中發生了什麼變化 –

+0

我不敢說,我用了ado.net @ChrisSchaller –

回答

0

我面臨同樣的錯誤,並且方式得到它的工作是:

  1. 確保同時引用的EntityFramework,和您的供應商的DLL上 你的T4模板;這足以擺脫這個錯誤。
<#@ assembly name="$(TargetDir)\EntityFramework.dll" #> 
<#@ assembly name="$(TargetDir)\EntityFramework.SqlServer.dll" #> 
  • 配置文件不被讀取,因爲T4在不同的上下文中運行;因此您需要創建一個接受連接字符串的DbContext構造函數;那麼您在創建T4中的上下文時將其傳遞給它。