2011-11-10 7 views
2

私はC#、EF、SQL Serverを使用しており、親子関係のあるテーブルはほとんどありません。 2つ以上ありますが、この例では簡単に2つだけを使用します。定義済みの行バージョンのエンティティフレームワークの更新

表帳

Id 
DateModified 
RowVersion 

表ページ

Id 
BookId - this is foreign key to Book.Id 
RowVersion 

任意のページ/ページは、私はブックのテーブルにDateModifiedを更新する必要がアップデートされているとき。

それは私が常に単に

SELECT * FROM Page 
WHERE RowVersion > Book.RowVersion 

ような何かをすることによってしかし、これを行うために各書籍の最新の変更を取得できるようにするユニークな値だから私たちは、変化を追跡するためにRowVersionを使用していますRowVersionsの前にBookテーブルのRowVersionが常にPagesに更新されていることを確認する必要があります。私は現在、このような何か持っている私のEDM層で

class Page 
{ 
    void OnPageChanged() //this is hooked to OnPropertyChanged 
    { 
    this.Book.UpdateDateModified(DataTime.Now); 
    } 
} 

はこれを行うには、最初に更新され、トランザクションがコミットした後にそのRowVersionがあまりにも最初に更新されているページになります。それは私が必要なものではありません。

質問OnPageChanged()の代わりにOnPropertyChangingイベントを処理すると、これが一貫性を保証しますか?それはOnPropertyChangedで、EFによって生成されたSQLで更新が行われる順序が決まりますか?この場合の他の提案はありますか?

答えて

3

私はこれが可能ではないと思います。私は今それを試すことはできませんが、Linqクエリでタイムスタンプ(RowVersion)を比較できるというのは本当の疑問です。これはバイト配列にマップされ、バイト配列は比較できません。データベース内の操作の順序は、あなたのコントロールから完全に外れています。エンティティが更新される予定の順序に基づいてロジックを構築することはできません。あなたのページと本が2つの別の電話番号(SaveChanges)で保存される場合にのみ、これを行うことができます。このような場合は、OnPropertyChangesは一切使用できません。ページを変更する前に、手動でBookの変更を処理する必要があります。

+0

私は 'binary'を 'bigint'に変換する計算カラムを持っています。比較は問題ではありません。注文に関しては、私もそれに頼らない方に傾いています。だから私はこのアプローチを無駄だと考えています。ありがとう – Paul

関連する問題