0

C#アプリにプロパティAとプロパティBのTestClassがあるとします。コードによってBの値を変更し、プロパティAは変更しません。SimpleRepositoryのUpdateメソッドでデータベースのTestClassを更新します。

ご覧のとおり、データベースのプロパティAの値も更新されます。

テストは簡単です。データベースの値Aをアプリの外部で(「手動で」)変更してから、アプリから更新を行います。プロパティAの値は、アプリ内のTestClassの状態に応じてその値に戻ります。

だから、私の質問:SimpleRepositoryによってクラス全体ではなく、一部のプロパティのみを更新することは可能ですか?'IgnoreFields'の可能性はありますか?

4

2 に答える 2

1

特定のフィールドを除外するのではなく、ステートメントにoptimistic concurrency必要なものがあります。UPDATEつまり、テーブルを更新するときに、行のフィールドの値が実際に最後に実行されたときの値であることを保証するWHERE句がステートメントに追加されます。UPDATESELECT

Aしたがって、あなたの例で、いくつかのデータと値を選択しB1と仮定しましょう2。ここで、更新したいとしましょうB(以下のステートメントは単なる例です)。

UPDATE TestClass SET B = '3' WHERE Id = 1;

ただし、そのステートメントを実行する代わりに (同時実行性がないため)、次のステートメントを実行してみましょう。

UPDATE TestClass SET B = '3' WHERE Id = 1 AND A = '1' AND B = '2';

そのステートメントにより、レコードが誰にも変更されていないことが保証されます。

ただし、現時点では、Subsonic の SimpleRepository があらゆるタイプの同時実行をサポートしているようには見えないため、これは大きな失敗になるでしょう。POCO を使用できる非常に単純なリポジトリ ライブラリを探している場合は、Dapper をお勧めします。実際、Dapper は Stackoverflow で使用されています。パラメータ化された SQL ステートメントを単純に送信するため、非常に高速であり、更新ステートメントに並行性を簡単に組み込むことができます。

  1. このStackoverflow 記事は、すべての CRUD 操作に Dapper を使用する方法に関する全体的な記事です。
  2. このStackoverflow の記事では、Dapper を使用して挿入と更新を実行する方法を示しています。

注: Dapper を使用すると、基本的な SQL ステートメントを送信するため、実際にやりたいことも実行できますが、同時実行を使用しないことはお勧めしません。

于 2012-09-12T11:19:04.470 に答える
1

このような場合、DataObject で update メソッドを呼び出さないでください。基本的に、オブジェクトが変更されており、DB で更新する必要があることを示しています。サブソニックは次のようなクエリを生成します

UPDATE TestClass SET A ='', B='', ModifiedOn = 'DateHere' WHERE PrimaryKey = ID

プロパティ B のみを変更するには、UPDATE クエリを手動で作成する必要があります。Subsonic.Updateクラスを見てください。
理想的には、データ オブジェクトの新しいインスタンスを手動で作成するべきではありません。作成する場合は、Subsonic.Selectクエリから返されたオブジェクトから値がコピーされていることを確認してください。
そのため、1 つのプロパティだけでも値を更新すると、他のすべてのプロパティは、プロパティのタイプに応じてデフォルト値ではなく、DB からの独自の値を保持します。

于 2012-09-12T11:20:04.407 に答える