「コメント」というクラスが「エンティティ」という抽象タイプを参照するシナリオがあります。流暢-の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つですが、現時点でデータベース構造やモデルを変更しないでください。
ご意見をいただければ幸いです。
クエリ()の代わりにQueryOver ()を使用して問題を解決しました。これにより、Session.QueryOver ().Where(m => m.EntityがCar)のようなものが許可されます。実行時の例外はありません。 –
UnclePaul