5

私はEF 4.2コードの最初のモデルを使ってプロジェクトを進めています。このモデルには、製品のTPH継承構造が含まれています。この継承モデルの多形性の結果を弁別器にグループ化し、いくつかの問題にぶつかっている必要があります。エンティティフレームワーク4.2識別子ごとの階層グループごとのテーブル

エンティティフレームワークは、このグループ化を完了するためにディスクリミネータを公開しません。私の最初の質問は、この弁別者に直接アクセスできるのですか?私の読書と経験は私にはないと言っているので、私はこの解決策を思いついた。それはうまく実行されていないと私はそれが維持する必要がある方法に満足していません。

Public MustInherit Class Product 
     <key()> 
     Public Property ProductID as integer 

     <StringLength(50, ErrorMessage:="Max 50 characters")> 
     <Required(ErrorMessage:="Product name is required")> 
     Public Property Name as String 

     <TimeStamp()> 
     Public Property Time_Stamp as DateTime = DateTime.Now() 
End Class 

Public Class Desktop 
     Inherits Product 

     <StringLength(50, ErrorMessage:="Max 50 characters")> 
     <Required(ErrorMessage:="Processor is required")> 
     Public Property Processor as String 
End Class 

Public Class Monitor 
     Inherits Product 

     <Required(ErrorMessage:="Monitor size is required")> 
     Public Property Size_Inches as Integer 
End Class 

私は製品を受け取り、それを文字列としてbasetype名前だ返す拡張メソッドを構築しました:

私のクラスでは、この(簡体字)のようなものを見て。私はそれらを介して実行できるようにして

<Extension()> 
Public Function ProductType(ByVal inProduct as Product) as String 
     ProductType = inProduct.GetType().BaseType.Name 
End Function 

が、私は種類によってグループに製品の結果をこのような構造を構築しました:

Dim tmpProducts = db.Products.ToList() 
Dim GrpProducts = tmpProducts.GroupBy(Function(prod) prod.ProductType) _ 
          .Select(Function(s) New With {.ProductType = S.Key, 
                  .Products = S }) 

私は今、リストをループは、私が欲しいの行動を取得することができ、性能は理想的ではなく、製品の数が増えるにつれてそれは容認できないと心配しています。

For Each ProductGroup in GrpProducts 
     Dim TypeName as String = ProductGroup.ProductType 
     Dim TypeProducts = ProductGroup.Products 
Next 

また、これは私の共有プロパティ(名前)への容易なアクセスを与えることができますが、今私は多分彼らの本当の種類、型名の周りを選択した場合にこれらをキャストするために多くのオプションを持っていません。 。 。

上記のコードエラーを許していただきありがとうございます。現時点ではプロジェクトにアクセスできないので、私はメモリからサンプルを再入力しました。

答えて

2

解決策はもう少しモデル化することで、新しいエンティティProductTypeのプロパティはNameです。次に、ProductProductTypeの間に単純な1-Nの関係があります。私はEntityFrameworkを使用していませんが、NHibernateを使用すると、フレームワークを常にクエリでそのテーブルに参加させることができ、ProductごとにProductTypeのプロキシが返されず、パフォーマンスが低下する可能性があります。アドオンとして

、将来的にProductTypeは(ようProductTypeのすべてのProductに共通する値など)他の興味深い性質を開発することができ、それはの即時費用を持っているものの、それは、あなたのソリューションに柔軟性を追加データベースに別のテーブルを追加します。 LINQクエリ後

+0

弁別によってあなたにグループを解決する方法を取得する必要があります。最近、オーバーライド可能な "ProductTypeName"プロパティをベースクラスに追加しています。クールジーを感じ、記憶されたデータを繰り返しますが、パフォーマンスは向上します。 – sgrade1979

1

は、私は可能な場合は、共通のプロパティはタイプ定義に属している感じが、これは、確かにオプションです

from a in db.Records 
group a.ID by new 
{ 
    Name= a is Audio ? "Audio" : 
      a is Video ? "Video" : 
      a is Picture ? "Picture" : 
      a is Document ? "Document" : "File" 
} into g 
select new 
{ 
    Name = g.Key.Name, 
    Total = g.Count() 
} 
関連する問題