2012-02-21 14 views
2

テンプレートによって生成されたクラスのイベントハンドラー(EntityFramework内のT4テンプレート)を登録する必要があります。部分クラスコンストラクターとイベントハンドラーの登録

現在、生成されたコードを編集して、生成されたクラス(モデルコンテキスト)のコンストラクタ内にハンドラを登録しました。

現在のコード:

public MyAppContext(string connectionString) 
     : base(connectionString, ContainerName) 
    { 
     this.ContextOptions.LazyLoadingEnabled = true; 
     // Register the event handler 
     this.Connection.StateChange += Connection_StateChange; 
    } 

問題は、コードはこれまでに、将来的に再生成された場合は、上記のコードは上書きされますされ、イベントハンドラは、もはやフックアップしないてしまいます...

コードの再生成は、EFデザイナーを開いてキャンバス上でテーブルを動かすなど、最小のものから自動的に発生します。そのため、必須のコードを生成されたクラスに残しておく必要はありません。

私たちは部分クラスに登録して、生成されたコードをそのまま残すことができますか?

EGには、コンストラクタが呼び出された後も常に発生するイベントがありますか?

答えて

5

この問題に対する答えは、コンストラクタの最後にメソッドの呼び出しに置くためにT4テンプレートを編集することです:

は、あなたはそれをこのように使用することができます。

このメソッドは、テンプレートによって生成される部分クラスのコンテキストでは、部分的なメソッドである必要があります。

テンプレートに部分メソッドの定義が含まれている必要があります。

その後、カスタムパーシャルクラスがそのメソッドを実装することができ、それが生成された部分クラスで定義されたコンストラクタによって呼び出されます - あなたが好きと部分的方法というguranteedするようになりました、あなたはその部分クラスに何度でも再生することができます誰もテンプレートを編集しないと仮定して、常に呼び出されます。

誰かがテンプレートを編集して部分的なメソッドの定義を削除した場合、コンパイルエラーが発生します。修正が簡単です。

誰かがテンプレートを編集し、コンストラクタから部分メソッドへの呼び出しを削除した場合、残念なことに、コンパイラはあなたのことを知ることができません。 T4テンプレートコード「MyApp.Contextにおけるコンストラクタと部分メソッド定義の

スニペット:

ここTIDビットの私の解決策です。TT」(T4 syntax and its use within the EntityFrameworkの偉大な説明についてはここを参照してください):

public <#=code.Escape(container)#>(string connectionString) 
    : base(connectionString, ContainerName) 
{ 
<# 
    WriteLazyLoadingEnabled(container); 
#> 
    // Call the OnContextCreated() method to perform any necessary 'post creation' setup 
    OnContextCreated(); 
} 

// Define the OnContextCreated partial method so that the accompanying partial Context 
// class can implement this method. 
partial void OnContextCreated(); 

部分メソッドを実装するカスタム部分クラスと配線アップイベントハンドラ:

public partial class MyAppContext 
{ 
    /// <summary> 
    /// Performs all 'post creation' operations for the MyAppContext 
    /// 
    /// ********************************* 
    /// NOTE: If you get a compiler error: 
    /// 'No defining declaration found for implementing declaration of partial method 'OnContextCreated()' 
    /// then it is likely that the partial class MyApp.Context.cs does not contain a corresponding 
    /// definition for the partial method OnContextCreated(). 
    /// This can occur if the MyApp.Context.tt template no longer generates the definition. 
    /// SOLUTION: Edit the MyApp.Context.tt T4 template to ensure that that partial method is defined AND 
    /// that it is called from EACH MyAppContext() constructor. 
    /// ********************************* 
    /// 
    /// </summary> 
    partial void OnContextCreated() 
    { 
     // Register the event handler 
     this.Connection.StateChange += Connection_StateChange; 
    } 
} 
+0

これは大きな助けでした!ありがとう! –

0

中間基本クラスはどうですか?

次に、生成されたクラスはそれから継承できます。

+0

残念ながら、これはまだ私達が編集している必要が中間コードから継承するために生成されたコード - 生成されたクラスのコンストラクタにハンドラを設定することとまったく変わりません。 – JTech

2

あなたはEFについて話していますか? これには特別な拡張メカニズムがあります:OnContextCreated()partialメソッド。

partial class MyAppContext 
{ 
     partial void OnContextCreated() 
     { 
      // Register the event handler 
      this.Connection.StateChange += Connection_StateChange; 
     } 

     void Connection_StateChange(object sender, StateChangeEventArgs e) { 

     } 
} 
+0

ひあ、答えてくれてありがとう。はい、私はEFについて話しています。 OnContextCreated()は完璧に聞こえる!しかし、OnContextCreated()を部分クラス内に置くとコンパイラエラーが発生します: '部分メソッドの宣言を実装するための定義宣言が見つかりません '... OnContextCreated()''。何らかの理由で、EFによって作成されたコンテキストは、生成されたコードに部分的なメソッドを入れていません。 * .ttテンプレートファイルを自分で編集することを除いて、それをどうやってやるかわからない。助言がありますか? – JTech

+0

はい、私は* .ttをちょっと修正しなければならないと言います。 (なし* .tt EF4モデルは常にそれを持っています。) –

関連する問題