2017-03-02 27 views
1

私は自分のアプリケーションでEFデータベースファーストモデルを使用します。それはWPFのMVVMのアプリですので、私は長い起動DbContextを使用します。これは、アプリケーションの起動時に作成され、終了時に破棄されます。 clientssettings -Entity Framework 6は、既存のレコードを別のレコードの値で更新します。

、2つのテーブルがあります。 settingsは、すべてのクライアントの設定をclient_idを外部キーとして、settings_idをプライマリキーとして格納します。 このsettingsテーブルでは、私はsettings_id=1client_id=1のある「デフォルト」レコードを持っています。私は、ボタンを押して私のアプリがクライアントのための 'デフォルト'の設定を復元するようにしたい。私vewmodelで

私は私のデシベルのエンティティモデルクラスですタイプClientObservableCollectionを持っている、とタイプClientのプロパティSelectedClient、現在は(いくつかのリストボックスで)クライアントを選択して結合しました。また、エンティティクラスSettingsがあります。このフィールドには、設定テーブルの異なる設定を表すいくつかのフィールドがあります。私はこれらのすべての設定を、現在選択されているクライアントの設定を置き換えるために 'デフォルト'レコードから取得します。

だから私は何をやっている:

public void OnResetClientSettingsCommandExecute() 
    { 
     var defaultSettings = Global.DbContext.Settings.FirstOrDefault(c => c.client_id == 1); 
     if (defaultSettings == null) return; 

     var tmp = defaultSettings; 
     tmp.client_id = SelectedClient.client_id; // doing this to change the only field which needs to remain untouched    
     var selectedClientSettings = Global.DbContext.Settings.FirstOrDefault(c => c.client_id == SelectedClient.client_id); 
     selectedClientSettings = tmp; 

     Global.DbContext.SaveChanges(); 

    } 

をこのコードは全く動作しません。私がここにいるのは、settingsからSelectedClientのclient_idに私の 'default'レコードを変更することです。client_idです。私はなぜそれが起こるかわからない、私は使用すると思ったtmpそれは大丈夫だが、いいえ。 私はAttach()方法を使用するかModifiedにエンティティのStateを変更するいくつかの慣行がある知っている - 私はそれらのすべてを試してみましたが、誰も私のために働いていない、私は長い間生活DbContextのアプローチを使用するので、私は考えます。

正直、私のアプリでは一般的にレコードを更新するのは非常に混乱しています.DbContext.SaveChanges()メソッドはデータベースの変更を保存しませんが、何らかの理由でロールバックします。だから私は石の時代のビットです生のSQLクエリを使用する必要があります。

誰かが私は私が間違っているのかを把握するのに役立ちます。ありがとう。

+0

デフォルト設定値でデータベースに別の行を作成し、選択したクライアントIDに正しくリンクしますか? – dbraillon

+0

はいいえ、私はすでに私はあなたが気づいているはずとのclient_idフィールド –

+1

のを除いて、デフォルトの1の者によって、すべてのそれのフィールドを置き換えたい、ラインを持っている、あなたはそれをあなたのやり方を行うことはできません。 'var tmp = defaultSettings;'は新しいオブジェクトを作成せず、既存のオブジェクトへの新しい参照のみを作成します。 – dbraillon

答えて

1

あなたはこの

public static void CopyValues<T>(T source, T destination) 
{ 
    var props = typeof(T).GetProperties(); 

    foreach(var prop in props) 
    { 
     var value = prop.GetValue(source); 
     prop.SetValue(destination, value); 
    } 
} 

その後、一時的な変数にあなたのキーを割り当てるプロパティの残りの部分をコピーし、元の値に戻し、あなたの鍵を再割り当てするようなメソッドを持つクラスを作成することができます。

+0

これはまさにiveが探していたものですが、今は主キーをコピーしようとしているため、exceptiopnが発生します。私はこれを変更して、プライマリキー 'settings_id'をデフォルト設定から選択したクライアント設定にコピーするのをスキップしますか? –

+0

主キープロパティをプログラムで見つけることができる場合は、foreachループ内にロジックを追加して、そのプロパティをスキップできます。 –

1

正しい方法です。しかし、それは疲れている!

public void OnResetClientSettingsCommandExecute() 
{ 
    var defaultSettings = Global.DbContext.Settings.FirstOrDefault(c => c.client_id == 1); 
    if (defaultSettings == null) return; 

    var selectedClientSettings = Global.DbContext.Settings.FirstOrDefault(c => c.client_id == SelectedClient.client_id); 
    selectedClientSettings.serviceName = defaultSettings.serviceName; 
    selectedClientSettings.write_delay = defaultSettings.write_delay; 
    // etc... 

    Global.DbContext.SaveChanges(); 
} 

AutoMapperを使用することをお勧めします。書くのは簡単です。

関連する問題