2012-02-21 13 views
3

私はWPFの初心者です。Linq To Entities(およびSQLiteデータベース)を使用して小さなアプリケーションを構築しています。プロパティの変更を反映するためにデータベースをいつ更新する必要がありますか?

プロパティが変更されたときにデータベースを更新するために、どこでメソッドを呼び出す必要がありますか? 私はこのようなViewModelにでプロパティに言う:

public string FirstName 
{ 
    get 
    { 
     return this.person.FirstName; 
    } 
    set 
    { 
     this.person.FirstName = value; 
     OnPropertyChanged("FirstName"); 
     this.person.updateFirstname(value); 
    } 
} 

私はこれが最善の解決策であるかどうかわからないです...

答えて

2

をデータベースに保存する際の問題はUnit of Work patternを生じ、 。 Linq-to-Entitiesは、ObjectContextでこれを妥当に実装しています。この場合、データはコンテキスト内でキューに入れられ、論理作業単位の完了時にデータベースに保存されます。

例では、コンテキストに接続されている可能性が高いL2EエンティティPersonのプロパティを既に設定しています。 ObjectContext.SaveChangesに電話すると、updateFirstnameメソッドを必要とせずに保存されます。

ObjectContext.SaveChangesをコールして(作業単位を終了する)、ユーザーが明示的に保存するか、フォームが閉じられたときにこれを行うかどうかを決定する必要があります(オプションで、ユーザーが変更をコミットまたは破棄する)ここで合理的なアプローチです。これを実装するには、ユーザーのアクション(通常はWPF ICommandpublished by the viewmodel and bound to the viewでモデル化されています)が実行されたときに、ビューモデルがObjectContextを参照し、SaveChangesメソッドを呼び出すことができます。

+0

ありがとうございます。ObjectContextを認識できませんでした。私はこれを調べます – Peekyou

+0

LinqからEntitiesへの 'Person'、' ObjectContext'を使用しない場合はどうやってクエリしますか? – codekaizen

+0

Hum申し訳ありませんが、実際に私はそれを使用していますが、ObjectContextと呼ばれていたことはわかりませんでした... – Peekyou

0

個々のフィールドの周りではなく、作業単位の周りに更新を集中する必要があります。データベースが適切に正規化されていれば、各行はエンティティを表し、そのように扱われる必要があります。エンティティを更新すると、エンティティを「有効」状態に保つ必要があります。あなたのシナリオでは、アプリやサーバーがあなたの人のレコードを爆破した場合でも、姓を更新する意図で人の名前を更新すると無効になります。グリッドの「一度に行全体を更新する」戦略とルート上のMVVM、私は通常のいずれかピギーバックそのイベントの面では

のviewmodelにまたは私はちょうどそれらを保存]ボタンを与える:)

0

それがサービスを注入するのが最善ですあなたのViewModelコンストラクタにインターフェイスし、ある種のサービスを使用してデータベースを更新します。 このようにして、疎結合のシステムになり、ViewModelはデータアクセスレイヤーに無関係な状態になります。

+0

彼は注射するためにサービスを使用していません、彼は特にEntity Frameworkを使用しています。 – codekaizen

+0

非常に小さなアプリケーションでこれは妥当ですか? – Peekyou

+0

@Peekyou - Entity Frameworkを明示的に使用しているので、合理的ですが、おそらく必要ありません。これは一般的な無回答のようなもので、あまり役に立たないでしょう、私は恐れています。 – codekaizen

関連する問題