2

私はC#、EF、SQL Serverを使用しており、親子関係のあるテーブルがいくつかあります。2つ以上ありますが、この例では、簡単にするために2つだけを使用します。

テーブルブック

Id
DateModified
RowVersion

テーブルページ

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

1つまたは複数のページが更新されたらDateModified、ブックテーブルで更新する必要があります。

変更を追跡するために使用しています。これは、次のような操作RowVersionを行うだけで、各本の最新の変更を常に取得できるようにしたいという独自の価値があるためです。

SELECT * FROM Page
WHERE RowVersion > Book.RowVersion

RowVersionただし、これを行うには、 inテーブルが常にinの前にBook更新されていることを確認する必要があります。RowVersionsPages

私のEDMレイヤーには、現在次のようなものがあります。

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

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

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

4

1 に答える 1

3

これは不可能だと思います。今は試すことができませんがRowVersion、Linqクエリでタイムスタンプ()を比較できるかどうかは本当に疑問です。これはバイト配列にマップされており、バイト配列は比較できません。データベース内の操作の順序は完全に制御できません。エンティティが更新される予想される順序に基づいてロジックを作成することはできません。あなたのページと本が2つの異なるSaveChanges呼び出しによって保存される場合にのみそれを行うことができます。このような場合、まったく使用できず、ページに変更を加える前に手動で変更をOnPropertyChanges処理する必要があります。Book

于 2011-11-11T09:48:17.327 に答える