2

同じ Car エンティティにマップする 2 つの異なるデータ モデルがあります。同じエンティティに対して 2 つのマッピングが存在すると不平を言う nhibernate を停止するために、Car と同じ (したがって Car から継承する) ParkedCar という 2 番目のエンティティを作成する必要がありました。

public class Car
{
     protected Car()
     {
       IsParked = false;
     }

    public virtual int Id { get; set; }  
    public  bool IsParked { get; internal set; }
}

public class ParkedCar : Car
{
        public ParkedCar()
        {
            IsParked = true;
        }
       //no additional properties to car, merely exists to support mapping and signify the                           car is parked
}

唯一の問題は、次のように Criteria API を使用してデータベースから Car を取得するときです。

SessionProvider.OpenSession.Session.CreateCriteria<Car>()
                    .Add(Restrictions.Eq("Id", 123))
                    .List<Car>();

このクエリは、ParkedCar データ モデルからの Car エンティティを返します。あたかも nhibernate がデフォルトで特殊なエンティティに設定されているかのようです。そして、マッピングは反抗的に正しい場所を探しています:

<class name="Car" xmlns="urn:nhibernate-mapping-2.2" table="tblCar">

<class name="ParkedCar" xmlns="urn:nhibernate-mapping-2.2" table="tblParkedCar" >

どうすればこれを止めることができますか?

4

2 に答える 2

3

クラスマッピングにポリモーフィズムプロパティを設定する必要があると思います

<class "Car" polymorphism="explicit" ...
于 2010-05-14T18:41:42.867 に答える
0

ParkedCarはCarを拡張するため、Carをクエリすると、CarオブジェクトとParkedCarオブジェクトの両方が返されます。特別なクラスプロパティを使用してHQLを使用してタイプを制限できますfrom Car c where c.class = Car。基準APIではこれができないと思います。

または、適切なサイズのリストを取得した後、リストをフィルタリングすることもできます。

于 2010-05-14T18:13:35.260 に答える