2012-03-13 12 views
0
私は、次の流暢なマッピングを使用しています

が発生します。は、2つのクラスに無効なキャスト例外

1.Applicationクラス:私のコアドメインでシンプルなアプリケーションです

public ThirdPartyAppMap() 
    { 
     Schema("Data"); 
     Id(x => x.ThirdPartyAppId).GeneratedBy.Identity(); 
     Map(x => x.AppName); 
     Map(x => x.CreationTime); 
     Map(x => x.Enabled); 
     References(x => x.ThirdPartyCustomer, "ThirdPartyCustomerId").Class(typeof(ThirdPartyCustomer)); 
     HasMany(x => x.ThirdPartyUsersIds).Table("Data.ThirdPartyUser").KeyColumn("ThirdPartyAppId").Element("UserId").AsBag(); 
    } 

それのサブクラス:ApplicationExtマッピング:

public ThirdPartyAppProxExtMap() 
    { 
     Table("Data.ThirdPartyApp"); 
     KeyColumn("ThirdPartyAppId"); 
     this.HasManyIds(x => x.DeviceToAppRelIds, "Data.ThirdPartyDeviceToAppRel", "AppId", "ThirdPartyDeviceToAppRelId"); 
    } 

同じテーブルにマップされていますが、IDのリストであるhasmanyプロパティが追加されています。 このクラスは、コアドメインに基づいた上位レベルのドメインにあり、 コアドメインは、上位ドメインのアプリケーションクラスのrelsを知る必要はありません。

マッピングが正常に動作しますが、NHセッションオブジェクトでの作業中、私は例外が発生します。

私は、私は次の例外受け取る

Session.Refresh(BaseAppObject) 

を呼び出すと:それはスロー

Unable to cast object of type 'RedPill.Applicative.Module.CM.Domain.ThirdPartyApp' to type 'RedPill.Applicative.Module.PI.Domain.ThirdPartyAppProxExt'. 

をBaseAppObjectには存在しない拡張型のプロパティにデータを割り当てようとしたため、ExtAppObject上でのみinvalidcastexceptionが発生しました。 プロファイラーを見ると、sesionオブジェクトはBaseApplicationObjectではなくExtApplicationObjectをフェッチしようとしました。 基本的に、私はSession.Get()を正常に動作するBaseAppObjectを実行しましたが、Session.Refresh()を使用してリフレッシュしようとしているときにExtApplicationObjectを取得しようとしましたが、NHが選択からオブジェクトを構築しようとしたとき無効なキャスト例外。

これについてのヘルプはありますか?あなたは多くの理由のために失敗した単一のテーブルにテーブルごとのクラスを使用しようとした

+0

サブクラスではなくディスクリミネータでマッピングしてはいけませんか?私はサブクラスのマッピングがあなたが望むどんな拡張プロパティでも独自のテーブルを持たなければならないと考えました。 – Fourth

+1

@Fourth http://www.philliphaydon.com/2011/08/fluent-nhibernate-table-inheritance-discriminators/、私の場合、列の値に基づいていないクラスを作成したいが、ジェネリックTタイプは、同じテーブルに両方ともマップされているにもかかわらず、異なるTが異なるマッピングを有するセッションから尋ねるものである。 –

+0

Ok、 これは最善の解決策かどうかわかりませんが、DBモデルを変更するのは、2つのエンティティがマップされている1つのテーブルではなく、1つのエンティティが別のテーブルを派生しているためです。テーブルを2つのテーブルに分けて、今では単純なFluent NHibernateの継承 - おそらくその優れたモデリングか、時には単にあなたが作業しているツールに自分自身を適応させる必要がある... –

答えて

0

よろしく、

ジェームズ。ディスクリミネータで複数のテーブルまたは階層ごとのテーブルに変更

関連する問題