Fluent NHibernate를 사용하여 레거시 테이블을 매핑해야합니다. 나는 테이블 구조를 제어 할 수 없다.동일한 id를 가진 테이블 당 서브 클래스 객체는 캐시에 충돌합니다.
표는 다음과 같습니다 :이 TypeId
에 대한 판별 값을 사용하여 테이블 당 서브 클래스 구조를 사용하여 매핑을 시도하고
TypeId ObjectId Data
10 1 ... //Cat 1
10 2 ... //Cat 2
20 1 ... //Dog 1
30 1 ...
. 나는 그 반대의 경우도 마찬가지 Dog 1
후 Cat 1
를로드하려고 할 때 또는
public abstract class Animal
{
public virtual int ObjectId { get; set; }
public virtual string Data { get; set; }
}
public class AnimalMap : ClassMap<Animal>
{
public AnimalMap()
{
Table("MyAnimals");
Id(x => x.ObjectId);
Map(x => x.Data);
DiscriminateSubClassesOnColumn("TypeId")
.AlwaysSelectWithValue();
}
}
public class Cat : Animal
{
}
public class CatMap : SubclassMap<Cat>
{
public CatMap()
{
DiscriminatorValue("10");
}
}
public class Dog : Animal
{
}
public class DogMap : SubclassMap<Dog>
{
public DogMap()
{
DiscriminatorValue("20");
}
}
문제
가 발생합니다.var a = session.Get<Dog>(1); //Dog1
var b = session.Get<Cat>(1); //null
두 번째 페치하기 전에 첫 번째 동물을 퇴거하면 작동합니다.
유형의 개체를 캐스팅 할 수 없습니다 'MyNamespace에 :
var a = session.Get<Dog>(1); //Dog1 session.Evict(a); var b = session.Get<Cat>(1); //Cat1
내가지도
은 모두Dog
내AnimalHome
클래스에Cat
, 나는 다음과 같은 예외를 얻을. Dog '을 입력하여 'MyNamespace를 입력하십시오. Cat '.
이 캐시가 해당 유형으로 Dog
및 Cat
를 구분하지 않습니다 있는게 틀림 없어. 그냥 Animal 1
으로 생각하고 Cat 1
은 Dog 1
과 같습니다.
어떻게 든 실제 서브 클래스를 고려하여 캐시를 만들 수 있습니까? 또는 table-per-subclass 구조에서이 작업을 수행 할 수없는 경우이 테이블 매핑에 어떻게 접근해야합니까?