2011-07-02 8 views
2

私はクラスがあります。抽象クラスとNHibernateは

class abstract Car { 
    ... 
} 

class ConcreteCar { 
    ... 
} 

class AnotherConcreteCar { 
    ... 
} 

をしかし、それはNHibernateは、これらをマッピングする方法に関して非常に混乱しそうです。私が収集できるようにする必要があります:

List<Car> cars; 
for (Car car in cars) { 
    ... 
} 

私も次のcarIDを生成するための発電機を(代替は何ですか?)を使用したいと思います。それを許さないjoin-subclassがあり、率直に言って、それはすべて私を混乱させます。私はCarをインターフェイスにする必要があります。これは私の望むものではありません。

from item in session.Query<Car>() 
select item; 

が、私は彼らのサブクラスタイプにオブジェクトを型キャストする必要があります:私は、データベースを照会場合

はまた、関係なく、私が使用しているものの方法、(たとえば私はちょうど車スーパーや他のサブクラスを作成していません)サブクラスのプロパティとメソッドを使用するには?それは働くだろうか? NHibernateはサブクラスを実際に見つけ出し、サブクラスのオブジェクトを作成しますか?それとも、サブクラスに変換できないスーパークラスのオブジェクトを作成するだけですか?

答えて

1

私はこの種のアプローチをもう少し前に実装しましたが、それは私の特別なケースでは機能していたことを覚えています。

私はそう、あなたは(私はFluent NHibernateを使用しています)、以下の方法であなたのエンティティをマッピングすることができれば車はベーステーブルには、いくつかの共有の列であることを前提としています

CarMap:

public class CarMap : ClassMap<Car> { ... } 

ConcreteCarMap:

public class ConcreteCarMap : SubclassMap<ConcreteCar> 
{ 
    public ConcreteCarMap() 
    { 
     Extends<CarMap>(); 

     // other properties 
     // Map(x => x.Property).Not.Nullable(); 
    } 
} 

あなたは電子ことができることを持ちますあなたのクエリをXECUTE:

from item in session.Query<Car>() select item; 

そして実際、あなたは、サブクラスのプロパティとメソッドにアクセスするが、NHibernateはあなたのためにそれらを適切に構築するのに十分なintelligentだろうために、そのサブクラスタイプに返されるオブジェクトを型キャストする必要があります。

select 

-- all columns from Car 
-- all columns from ConcreteCar 
-- other columns from subclasses 

case 
    when f1.SubId is not null then 1 
    when f2.SubId is not null then 2 
    when f3.SubId is not null then 3 
    when f4.SubId is not null then 4 
    when f5.SubId is not null then 5 
    when f0.Id is not null then 0 
end as type 

from Car f0 
left outer join ConcreteCar f1 on f0.Id = f1.SubId 
-- other joins 

だから実装サブクラスの実際の数に応じて、これはパフォーマンスに影響を与えることができる。

NHibernateの構文この種の(擬似SQL)を使用することを達成するであろう。

これがあなたの質問に答えることを願っています。

0

かなり可能です。
inheritance mappingを参照。
session.Query<Car>を使用でき、nHibは適切なサブクラスのオブジェクトを作成することができます。
ご質問がある場合はお知らせください。

+0

? – BobTurbo

+0

なぜそうは見えないのですか?それを試して、それがどのように行くか見る。 –

0

はい、動作します。

これは私のコードです:

public abstract class Vote:EntityBase 

public class VoteComment:Vote,IVote 

public class VotePhoto:Vote,IVote 


internal List<Vote> Test() 
{ 
    return session.Query<Vote>().ToList(); 
} 

、これが結果です:基底クラスが抽象的であるのであれば、テーブル・クラスごとの戦略の仕事がする

enter image description here