2011-08-29 19 views
0

エンティティフレームワークがDBに変更を永続化させないという問題があります。私は静的メソッドを使用していくつかの値を読み込み、Entityコンテキストをスローします(usingステートメント内)。WPFでエンティティフレームワークを使用して変更を永続化する

オブジェクトはWPF DataGridにロードされ、そこでエンドユーザーが操作できます。

ユーザが変更を完了すると、「更新」ボタンが押され、オブジェクトのリストがデータ層に戻されてDBに保存されます。 UIで変更されたオブジェクトが新しい値を反映していることがわかります(データバインディングの問題ではありません)。

オブジェクトをロードしたエンティティコンテキストが破棄されてから、これらのオブジェクトを新しく作成されたコンテキストに永続化する必要があると思います。正しい?これを行うと、変更されたオブジェクトのエンティティ状態(状態が設定されていることがわかります)が「変更なし」に変更されます。 DBには何も保持されません。

私は行方不明ですか?ここで

は、値をロードし、更新するためのコードです:あなたはコンテキストからロードされたエンティティを変更しようとしている場合は、コンテキストを処分するべきではありませんので

public static List<SSIS_Configuration> GetConfigurationValuesForTenant(string tenantKey, SqlConnectionString connectionString) 
    { 
     List<SSIS_Configuration> configStrings = new List<SSIS_Configuration>(); 
     if (connectionString.IsValid()) 
     { 
      try 
      { 

       using (SSISFrameworkEntities entities = new SSISFrameworkEntities(connectionString.ToEDMXString("SSISFramework.SSISFramework"))) 
       { 
        string configFilterStartingValue = "CommonConfig_" + tenantKey; 

        configStrings = (from configString in entities.SSIS_Configurations 
            where configString.ConfigurationFilter.StartsWith(configFilterStartingValue) 
            select configString).ToList(); 
       } 
      } 
      catch { } 
     } 

     return configStrings; 
    } 

    public static void UpdateConfigurations(List<SSIS_Configuration> configurations, SqlConnectionString connectionString) 
    { 
     if (connectionString.IsValid()) 
     { 
      try 
      { 
       using (SSISFrameworkEntities entities = new SSISFrameworkEntities(connectionString.ToEDMXString("SSISFramework.SSISFramework"))) 
       { 
        foreach (SSIS_Configuration config in configurations) 
        { 
         entities.Attach(config); 
        } 

        entities.SaveChanges(); 
       } 
      } 
      catch { } 
     } 
    } 
+1

App.Current.Properties ["context"]のような場所にコンテキストを保持してみてください。彼らがセルフトラッキングエンティティでない限り、あなたがアタッチしても新しいコンテキストを使用しても変更は気付かれません。 –

+1

私の好みはUnityのようなIoCコンテナの中に自分のコンテキストを保持することです。次に、ライフサイクルを制御するためのパラメータを設定できます。コンストラクタインジェクションを使用して、すべてのビューモデルがコンテキストオブジェクトにアクセスできることを確認できます。 – Winger

+0

@Dustin、私はこのコードが別のエンドUIソリューションで使用されるクラスライブラリに格納されているので、それが私のソリューションに適しているかどうかはわかりません。主な用途はWindows WPFクライアントですが、コンソールアプリケーションやおそらくSilverlightアプリケーションで使用される可能性が最も高いです。 App.Currentはいつ利用可能ですか? –

答えて

1

WPFアプリケーションは、添付のエンティティのためのシナリオです。あなたがそれを処分するならば、多くの追加のロジックを実装しなければなりません。ユーザがエンティティとリレーションに対して行った新しい文脈をevery single changeに伝えなければならないからです。

あなたのシナリオでは、Attachを呼び出すとエンティティはコンテキストにのみ接続されますが、you need to set also their state(putエンティティをUnchanged状態にすること)が接続されます。実行する操作に基づいて、状態を正しくModified,DeletedまたはInsertedに設定する必要があることに注意してください。変更されたエンティティにも変更されたリレーションがある場合は、関連するエンティティの状態を設定する必要があります。エンティティ間の関係が変更された場合は、リレーション自体の状態も変更する必要があります。

+0

元の質問にこのコードが含まれていないことを指摘したいと思いますが、これを試してもまだ動作しませんでした。オブジェクトはビューレイヤーから戻ってきて、私はそれらをすべて変更して設定しますが、それでも更新はしません。私は自分の問題が基礎となるデータオブジェクトであることを理解しました。ビューでしたが、アップデートができないというエラーが表示されませんでした。私の設定の1つでは、私はこのエラーを生成することができましたが、今はストアドプロシージャを介してデータを更新する必要があると考えました。 –

関連する問題