2

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 テーブルに追加しようとすることに注意してください。

4

1 に答える 1

0

Fluent を使用して ID 列のマッピングを定義すると機能しますか? EF でこれを定義できるのではないかと思いますが、これは非標準のアプローチであるため、ここで何をしようとしているのかを想定していません (したがって、別の ID 列にマップしようとしています)。あなたの DbContext クラスに次のようなものがあります(これが正しくないことはわかっています。誰かが改善できるかもしれません):

modelBuilder.Entity<Product>()
            .HasMany(o=>o.MyProperty)
            .Map(o=>o.MapKey("Id"));
于 2012-12-20T15:45:01.513 に答える