0

Linq-to-SQL でオプティミスティック コンカレンシーをサポートするために、SQL Server タイムスタンプ列 (VersionNumber と呼ばれる) を使用しています。これは、関連するテーブルが 1 つだけの場合にうまく機能します。ただし、次のようなドメイン エンティティがあります。

Person: FirstName、LastName、Age、VersionNumber
Doctor: すべての Person プロパティ + 職業
Athlete: すべての Person プロパティ + Sport、YearsPro
Musician: すべての Person プロパティ + Instrument

私のDBには Person テーブルがあり、次に Person の各タイプの他のテーブルがあります。具体的なテーブル (アスリートなど) には、アスリートに必要な列のみがあります。具体的なテーブルには、Person テーブルとの 1 対 1 のマッピングがあります。この場合、VersionNumber を使用するにはどうすればよいですか? 具体的なテーブルに独自の VersionNumber 列を含めることができますか? Person テーブルだけに VersionNumber 列が必要ですか? このシナリオでデータを保存するにはどうすればよいですか?

この特定のケースでは、アスリートを救いたいと思います。現在、Person 基本クラスのみが VersionNumber を持っています。これを保存する方法がわかりません。

注: Person は既に C# ドメイン エンティティに VersionNumber プロパティを持っているため、同じプロパティ名を具象クラスに追加することはできません。

4

1 に答える 1

1

linq-to-sql は単一テーブルの継承をサポートしているため、データベースを自由に再設計できる場合は、すべてのフィールドを含む 1 つのテーブルを作成する必要があります。次に、type特定の行ごとにどの具体的な型がマテリアライズされるかを linq-to-sql に伝えるフィールドを追加します。

それができない場合は、楽観的ロックをテーブルごとに行う必要があります。各テーブルに VersionNumber 列を追加すると、linq-to-sql がそれを使用します。あなたが今持っている方法もうまくいきます。Linq-to-sql はテーブルの VersionNumber を使用しPerson、他のテーブルを更新するときに各プロパティが変更されていないことをアサートするようにフォールバックします。赤だったために DB でプロパティのいずれかが変更された場合、linq-to-sql は同時実行エラーで更新に失敗します。

于 2012-05-26T18:26:31.607 に答える