2012-03-13 5 views
0
나는 다음과 유창한 매핑을 사용하고

가 발생합니다두 클래스에 대한 잘못된 캐스트 예외

1. 신청 클래스 : 내 핵심 영역에서의 간단한 응용 프로그램입니다

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 속성을 추가합니다. 이 클래스는 핵심 도메인을 기반으로하는 상위 도메인에 있습니다. 상위 도메인에서는 핵심 도메인이 응용 프로그램 클래스의 rel을 알 필요가 없습니다.

매핑은 잘 작동하지만, NH 세션 객체로 작업하는 동안 예외가 발생 :

내가 호출 할 때 나는 다음과 같은 예외가 발생

Session.Refresh(BaseAppObject) 

가 :

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

그것은 던졌습니다 ExtAppObject에서만 BaseAppObject에없는 확장 유형 속성에 데이터를 할당하려고했기 때문에 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 모델을 변경하면 하나의 엔티티가 다른 엔티티를 파생시키는 두 엔티티가 매핑되는 하나의 테이블 대신 엔트리를 분할한다는 점이 다릅니다. 테이블 하나가 다른 하나를 파생시키는 두 개의 테이블로 변환하고 현재는 단순한 Fluent NHibernate 상속 - 아마도 더 나은 모델링이거나 어쩌면 단순히 당신이 작업하고있는 툴에 적응할 필요가있을 것입니다. –

답변

0

감사합니다,

제임스. discriminator를 사용하여 다중 테이블 또는 계층 구조 테이블로 변경

관련 문제