2010-12-10 11 views
0

免責事項:私は一般的にNH & ORMをかなり新しくしています。オプションNHibernate 3.0 GA&FNHのSubclassMap(left join)

免責事項:NH3.0GAで使用するには、hereのFNHビルドで作業しています。

public class MyBaseClass { 
    public virtual int Id { get; set; }  
} 

public class MySubClass : MyBaseClass { 
    public virtual string SubClassVal { get; set; } 
} 

この:

一言で言えば、問題は、私は、テーブルあたりのサブクラスのシナリオのように定義された私のオブジェクト階層に、JOINをLEFTをマッピングする方法として、FNHのSubclassMapを使用したいということですFNHを経由してマッピングされます。

public class MyBaseClassMap : ClassMap<MyBaseClass> { 
    public MyBaseClassMap() { 
     Table("BaseClass"); 
     Id(x => x.Id, "Id").GeneratedBy.Assigned(); 
    }   
} 

public class MySubClassMap : SubclassMap<MySubClass> { 
    public MySubClassMap() { 
     Table("SubClass"); 
     KeyColumn("Id"); 
     Map(x => x.SubClassVal); 
    } 
} 

そして私は経由で取得:

public class Repository { 
    ISession session; //assume properly initialized ISession 
    public IList<T> GetAll<T>() where T: class { 
     return session.CreateCriteria<T>().List<T>(); 
    } 
} 

そして私のデータベースでは、BaseClassテーブルに1レコード、​​に0レコードがあります。

は、私がやりたいことは、このような何かを行うことによってMySubClassインスタンスとして実体を引き出すです:

var rep = new Repository(); 
var subclasses = rep.GetAll<MySubClass>(); 

そして、これがおそらくあるとして当然のことながら、返されるコレクションにはインスタンスが存在しませんそれの下にインナー・ジョインを実行します。これは私が立ち往生している場所です。私は、「オプションの」結合を指定することは、私がと考えているものであることを発見した。以下の(最も内側の)例外で私を提示し、これを実行している/コンパイル

public class MySubClassMap : SubclassMap<MySubClass> { 
    public MySubClassMap() { 
     Join("SubClass", j => { 
      j.KeyColumn("Id"); 
      j.Optional(); 
      j.Map(x => x.SubClassVal); // note that I've tried the map outside the Join() below, to no avail 
     }); 
     //Map(x => x.SubClassVal); 
    } 
} 

:私はにMySubClassMapを変更しようとしてきました

要素の名前空間「壷で「サブクラスに入社」:NHibernateの-mapping- 2.2 'は名前空間' urn:nhibernate-mapping-2.2 'で無効な子要素' join 'を持っています。可能な要素のリスト: 'プロパティ、多対1、一対一、コンポーネント、動的コンポーネント、プロパティ、任意、マップ、セット、リスト、バッグ、IDBAG、配列、プリミティブ配列、結合サブクラス、loader、sql-insert、sql-update、sql-delete、resultset、query、sql-query 'をネームスペース' urn:nhibernate-mapping-2.2 'に追加します。

私は、スタックトレースを投稿節約できますが、それのJISTは次のとおりです。私は関連するすべての情報だと思い

MyApp --> 
FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() --> 
NHibernate.Cfg.FluentConfiguration.BuildConfiguration() 

。私はNHのこの新しいバージョンとそれほど新しくないFNHのバージョンとの間の急激な変化にぶち当たっているかもしれないと思う。しかし、前に述べたように、私はルーキーであり、何かばかげたことをしている可能性があります。このような場合には、誰かが私を頭の中で叩いて、おそらく明らかになるはずのものがあると大変感謝しています。

ありがとうございます。

答えて

2

エンティティには1つのタイプがあり、変更されません。 BaseClassテーブルにのみレコードがある場合、そのエンティティは常にMyBaseClassになります。

エンティティが "タイプ"を変更できる場合、継承は使用しないでください。

+0

私は厄介だと思った。私を選別してくれてありがとう。 – Devfellow