2012-02-23 5 views
2

「コメント」というクラスが「エンティティ」という抽象タイプを参照するシナリオがあります。流暢-のClassMapは、プロパティ「エンティティ」に対して次のと非常に似ています:Fluent-nHibernateクエリで単一のプロパティ(識別子)のタイプ/クラスを指定する方法。

classMap.ReferencesAny(x => x.Entity) 
    .EntityTypeColumn("DiscriminatorType") 
    .EntityIdentifierColumn("DiscriminatorId") 
    .IdentityType<int>() 
    .AddMetaValue(typeof(Car), typeof(Car).Name); 
    .AddMetaValue(typeof(House), typeof(House).Name); 

すでに「家」という名前のクラスによってサブクラス化されたクラス「エンティティ」上記の例から発見したかもしれませんがと「車」と呼ばれるクラスです。この設定では、単に以下のようなことを行うだけで、特定のEntityのすべてのコメントを取得することは比較的簡単です。Session.Query()。Where(m => m.Entity == myCarObject).ToList()。すべてが魅力のように機能します。ここで

は単純化されたクラス構造です:

abstract class Entity{} 
class Car : Entity{} 
class House : Entity{} 

class Comment 
{ 
    public virtual Entity { get; set;} 
} 

はしかし、1のユースケースで私は、「車」を参照して「コメント」のすべてのインスタンスを取得する必要があります。

var allCommentsOnCars1 = Session.Query<Comment>().Where(m => m.Entity is Car); //or 
var allCommentsOnCars2 = Session.Query<Comment>().Where(m => m.Entity.GetType() == typeof(Car)); 

両方の例が動作しない(後者ははgettypeを(スロー)例外を実装されていない)が、それはとにかくこれを解決することが可能である:つまり、私は、次のような何かを達成しようとしていますか私は簡単に2つのテーブルを作成することで簡単に問題を解決することができます。すべての「車」コメントとすべての「住宅」コメントの1つですが、現時点でデータベース構造やモデルを変更しないでください。

ご意見をいただければ幸いです。

+0

クエリ()の代わりにQueryOver ()を使用して問題を解決しました。これにより、Session.QueryOver ().Where(m => m.EntityがCar)のようなものが許可されます。実行時の例外はありません。 – UnclePaul

答えて

-1

おそらく最も洗練された解決策ではありませんが、私はQuery()の代わりにQueryOver()を使用するだけで問題を解決しました。

+0

ソリューションを投稿できますか? –

関連する問題