C# MVC .NET4 を使用しています。EF5 (コードファースト)。
私たちは、ユーザーが任意のエンティティに追加のプロパティを動的に「添付」できるようにするシステムを構築しようとしています。
ProductClass と Products があるとします。エンティティごとにいくつかの「標準」フィールドがありますが、ユーザーは任意のプロパティを任意のレコードにキーと値のペアとして追加することを決定できます。たとえば、製品 123 には「StockMax」=「10」があるとします。
「アタッチされた」プロパティを持つ可能性のあるエンティティ (+10) が多数あるため、単一の「AttachedProperty」エンティティ/クラスを作成します (SQL では、PK={ParentTable, ParentId, PropertyKey} を持つテーブルに変換されます)。そうすれば、すべてのエンティティの添付プロパティに対して 1 つのクラスを保持できます (これは、ユーザー インターフェイスを構築するのに適しています)。
基本クラスを持つことで、EF でそれを達成できることがわかりました。
class EntityWithAttachableProperty {
public System.Guid Id {get;set;}
public ICollection<MyProperty> MyProperties {get;set;}
}
そして、そのクラスから私のエンティティに継承するには、次のようにします。
class Product : EntityWithAttachableProperties {
public string name {get;set;}
etc
}
私の問題は、これに継承を使用したくないということです。実際には関係のないものを論理的にグループ化する必要があります。また、必要のない 1 つの巨大な EntityWithAttachableProperties テーブルを SQL で取得します。
では、基本クラスなしで TPT を達成する方法はありますか? (おそらくモデルビルダーを介して)。そうすれば、次のようなクラスを取得できます。
class Product {
public System.Guid Id {get;set;}
public string name {get;set;}
public ICollection<MyProperty> MyProperties {get;set;}
etc
}
class ProductClass {
public System.Guid Id {get;set;}
public string Classname {get;set;}
public ICollection<MyProperty> MyProperties {get;set;}
etc
}
これを行うと、EF は Product_Id と ProductClass_Id を MyProperties テーブルに追加しようとすることに注意してください。