私は自分のアプリケーションでEFデータベースファーストモデルを使用します。それはWPFのMVVMのアプリですので、私は長い起動DbContextを使用します。これは、アプリケーションの起動時に作成され、終了時に破棄されます。 clients
とsettings
-Entity Framework 6は、既存のレコードを別のレコードの値で更新します。
、2つのテーブルがあります。 settings
は、すべてのクライアントの設定をclient_id
を外部キーとして、settings_id
をプライマリキーとして格納します。 このsettings
テーブルでは、私はsettings_id=1
とclient_id=1
のある「デフォルト」レコードを持っています。私は、ボタンを押して私のアプリがクライアントのための 'デフォルト'の設定を復元するようにしたい。私vewmodelで
私は私のデシベルのエンティティモデルクラスですタイプClient
のObservableCollection
を持っている、とタイプ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クエリを使用する必要があります。
誰かが私は私が間違っているのかを把握するのに役立ちます。ありがとう。
デフォルト設定値でデータベースに別の行を作成し、選択したクライアントIDに正しくリンクしますか? – dbraillon
はいいえ、私はすでに私はあなたが気づいているはずとのclient_idフィールド –
のを除いて、デフォルトの1の者によって、すべてのそれのフィールドを置き換えたい、ラインを持っている、あなたはそれをあなたのやり方を行うことはできません。 'var tmp = defaultSettings;'は新しいオブジェクトを作成せず、既存のオブジェクトへの新しい参照のみを作成します。 – dbraillon