2016-08-10 18 views
3

は私が後で使用できるいくつかの値をロードしようとしている非常に単純なT4を作成しようとしていSystem.Data.Entity.DbSet`1:T4 - Entity Frameworkのエラー:メソッドが見つかりません:「

<#@ template debug="false" hostspecific="false" language="C#" #> 
<#@ assembly name="System.Core" #> 
<#@ assembly name="c:\users\<username>\documents\visual studio 2015\Projects\2_DataModelGenerator\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll" #> 
<#@ assembly name="c:\users\<username>\documents\visual studio 2015\Projects\2_DataModelGenerator\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll" #> 
<#@ assembly name="c:\users\<username>\documents\visual studio 2015\Projects\2_DataModelGenerator\2_Data\bin\Debug\2_Data.dll" #> 

<#@ import namespace="System.Linq" #> 
<#@ import namespace="System.Text" #> 
<#@ import namespace="System.Data" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ import namespace="2_Data" #> 

<#@ output extension=".cs" #> 

<# 
    DevEntities dbContext = new DevEntities(); 

      var labelClassNames = (from sd in dbContext.tblDatas 
            where sd.SID == 155 
            select new 
            { 
             SID = sd.SID.ToString(), 
             SValue = sd.SValue.ToString() 
            }).ToList(); 

#> 

私はこのエラーを取得T4保存:

Error Running transformation: System.MissingMethodException: Method not found: 'System.Data.Entity.DbSet`1<2_Data.tblData> 2_Data.DevEntities.get_tblDatas()'

私は(EF 6.1.3を使用して)別の解決策では、このコードをテストしているし、それが(var labelClassNamesにデータをロードする)問題なく動作しますが。 T4テンプレートでのみ問題になっているようです。

別の名前空間をインポートする必要はありますか?私は何が欠けているのか分からない!

アップデート:私のTTコードで

 dbc context = new dbc(); 
     DevEntities mdc = new DevEntities(); 
     mdc = context.returnContext(); 

は私のクラスライブラリにクラスを追加しました:

public class dbc 
{ 
    private DevEntities dbContext; 
    public dbc() 
    { 
     dbContext = new DevEntities(); 
    } 
    public DevEntities returnContext() 
    { 
     return dbContext; 
    } 
} 

同じエラーが以前のように:

Running transformation: System.MissingMethodException: Method not found: 'System.Data.Entity.DbSet

しかし、私が含まれている私のプロジェクトにダウン.edmxファイルを含め、私のクラスライブラリからApp.configファイルをコピーした

No connection string named 'DevEntities' could be found in the application config file.

:私は、T4テンプレートをデバッグするとき

はしかし、私は別のメッセージが表示されます。 ttファイル

アイデア?

+0

dbcontextもそれは同じプロジェクトでだ、T4テンプレートでは表示されません。個別のコンパイルされたクラスライブラリプロジェクトでDbcontextを試して参照してください。問題は "2_Data"をロードすることです。 –

+0

@ M.Hassan - これを実行する方法の例はありますか?別のクラスライブラリにDBContextを追加しようとしましたが、同じタイプのエラーが発生しています。 – webdad3

+0

EntityFrameworkでT4を実行するために段階的に投稿します。 –

答えて

2

T4テンプレートの同じプロジェクト内のクラスは、それによって見えず、そのデバッグを簡単にするために、以下では、問題とデバッグの容易させずにEntityFrameworkで正常にT4を実行するためのステップバイステップです:

手順1:モデル用に別のクラスライブラリプロジェクトを作成する

アプリケーションとT4テンプレートによって参照される、モデル用の別のクラスライブラリプロジェクトを作成します。

これは、単体テストを簡素化し、T4の多くの問題を解決します。

ステップ2:設定ファイルの問題を避けるため、正しくれたconnectionStringを構成し、ときに再生成するコンテキストを上書きしないようにContextクラスを拡張する部分クラスを作成するには接続文字列

を解決します。 新しいオーバーロードコンストラクタを定義します。

例えば

、NorthwindEntities

 using System.Data.Entity; 
    namespace NorthWin 
    {   
     public partial class NorthwindEntities : DbContext 
     { 
      public NorthwindEntities(string connString) 
       : base(connString) 
      { 
      } 
     } 
    } 

STEP3:

あなたはT4テンプレートに必要なすべてのメソッドは、別のクラスでそれを作成する別のクラス(複数可)内のすべてのDALのメソッドを作成します(複数可)同じクラスライブラリプロジェクトで、T4テンプレートから呼び出すことができます。

クラス内でconnectionStringを明示的に定義します(接続文字列の一重引用符に注意してください)。 編集:またはインクルードテンプレートを使用できます。 例:

using System.Linq; 
    namespace NorthWin 
    { 
     public class DAL 
     { 

      string ConnectionString = @"metadata=res://*/NorthWind.csdl|res://*/NorthWind.ssdl|res://*/NorthWind.msl;provider=System.Data.SqlClient;provider connection string='data source=myserver;initial catalog=Northwind;persist security info=True;user id=xxx;password=yyy;MultipleActiveResultSets=True;App=EntityFramework';"; 

    public DAL (string connString) 
    { 
     ConnectionString =connString; 
    }  
    public int GetCustomerCount() 
      { 
       var n = 0; 
      // call ye new overload constructor 
       using (var ctx = new NorthwindEntities(ConnectionString)) 
       { 
        n = ctx.Customers.Count(); 
       } 
       return n; 
      } 
     } 
    } 

ステップ4:

:あなたのT4を構築 T4テンプレートのEntityFrameworkとコールDAL方法

<#@ template debug="false" hostspecific="true" language="C#" #> 
    <#@ output extension=".txt" #> 

     <#@ assembly name="System.Xml"#> 
    <#@ assembly name="$(TargetDir)NorthWin.dll" #> 
    <#@ assembly name="$(TargetDir)EntityFramework.dll" #> 
    <#@ assembly name="$(TargetDir)EntityFramework.SqlServer.dll" #> 
    <#@ assembly name="EnvDTE" #> 
    <#@ assembly name="System.Configuration" #> 

    <#@ import namespace="System.Configuration" #> 
    <#@ import namespace="System" #> 
    <#@ import namespace="System.Linq" #> 
    <#@ import namespace="System.Collections.Generic" #> 
    <#@ import namespace="NorthWin" #> 
    <# 

     int n=0; 
     var dal = new DAL(); 
    //call DAL methods 
     n= dal.GetCustomerCount(); 

    #> 

    <#= n #> 
    { 
     ... // More code here. 
    } 

出力の最小アセンブリを定義します

114 { ... // More code here. } 

編集:で説明したようにあなたがインクルードファイルを使用してコンフィギュレーションファイルかられたconnectionStringを得ることができます

Injecting Your Web.Config Connection String Into Your T4 Template

、あなたが接続を受け入れるコンストラクタであなたのDALのクラスにたconnectionStringを渡します文字列。あなたのテンプレートで

は、このコードを追加

<#@ include file="ConfigurationAccessor.ttinclude" #> 
<# 
var config = new ConfigurationAccessor((IServiceProvider)this.Host, @"path\to\ProjectWithConfig.csproj"); 
string connectionString = config.ConnectionStrings["MainConnectionString"].ConnectionString; 
#> 
+0

この例をありがとう。月曜日にこれを試してみます。 – webdad3

+0

それはうまくいった!詳細な例をありがとう。私はこの情報に匹敵するブログ記事を見つけられませんでした。 – webdad3

+0

ようこそ。あなたの問題を解決したことをうれしく思います。 –

関連する問題