1

サブクラスで同じ名前のメンバーを定義できないのはなぜですか?クラス継承ごとに1つのテーブルがありrowversion timestamp、各テーブルにフィールドがあります。エンティティ設計者はこれを許可newし、プロパティのキーワードを使用してそれを実現する必要があるようです。回避策は何ですか?使用できない場合、継承チェーン内の同じフィールドを異なる値で指定するにはどうすればよいnewですか?これは、rowguids、modifiedbys、modifieddatesなどを持つ他のデータベースにも当てはまる可能性があります。

編集:それを行う論理的な方法は、フィールドへの参照の名前を変更すること、つまりPersonRowversion、から派生するStudentクラスで行うことだと思いPersonます。

しかし、これらの種類のフィールドを自動的に追跡できるEFがありませんか?

4

1 に答える 1

5

クラスに同じ名前のメンバーを 2 つ持つことはできないためです。「新しい」はあなたが望むことをしません。「new」は継承されたメンバーを非表示にします。同じ名前の 2 つの異なるメンバーは提供されません。したがって、生成されたコードが「new」を使用した場合、C# コードから「親テーブル」の値にアクセスすることはできません。両方のデータベース テーブルに同じ名前の 2 つの列があることは問題ありませんが、2 つのテーブルが 1 つのクラスを構成する場合、概念モデルで重複する列名の名前を変更する必要があります。

「変更日」などに関しては、通常は 1 つだけ必要です。Animal のスーパー タイプと Dog のサブタイプがある場合、Entity Framework は、C# と同様に、タイプの「動物部分」または「犬部分」の更新をインスタンス全体の更新と見なします。

概念モデルとストレージ モデルは異なるものであり、異なるルールで機能することに注意してください。エンティティ モデルで作業するときは、厳密に OO または厳密にリレーショナルな用語で考えないように注意してください。エンティティ モデル内では、両方の世界を橋渡ししています。私が他の場所で書いたように

優れたオブジェクト リレーショナル マッピングを設計する際に乗り越えなければならない精神的障壁の 1 つは、主にオブジェクト指向の用語またはリレーショナルの用語のいずれかで自分の性格に合った方法で考える傾向があることです。ただし、優れたオブジェクト リレーショナル マッピングには、優れたオブジェクト モデルと優れたリレーショナル モデルの両方が組み込まれています。たとえば、People 用のテーブルと、Employees および Customers 用の関連テーブルを含むデータベースがあるとします。1 人の人物が 3 つのテーブルすべてにレコードを持っている場合があります。ここで、厳密なリレーショナルの観点から、従業員用のデータベース VIEW と顧客用の別のデータベースを構築できます。どちらも People テーブルの情報を組み込んでいます。いずれかのビューを使用する場合、一時的に個人を「ただの」従業員または「ただの」顧客と考えることができます。両方だとわかっていても。したがって、この世界観から来る人は、Employee と Customer が両方とも Person の (直接の) サブクラスである OO マッピングを実行したくなるかもしれません。しかし、これは私たちが持っているデータでは機能しません。1 人の人物が従業員レコードと顧客レコードの両方を持っているため (また、具体的なサブタイプ Employee と Customer を同時に持つことができる Person インスタンスがないため)、Person と Employee 間の OO 関係は、継承ではなく合成である必要があり、Person と Customer についても同様です。

于 2009-03-11T18:37:51.473 に答える