0

Fluent NHibernate를 사용하여 레거시 테이블을 매핑해야합니다. 나는 테이블 구조를 제어 할 수 없다.동일한 id를 가진 테이블 당 서브 클래스 객체는 캐시에 충돌합니다.

표는 다음과 같습니다 :이 TypeId에 대한 판별 값을 사용하여 테이블 당 서브 클래스 구조를 사용하여 매핑을 시도하고

TypeId ObjectId Data 
10  1   ... //Cat 1 
10  2   ... //Cat 2 
20  1   ... //Dog 1 
30  1   ... 

. 나는 그 반대의 경우도 마찬가지 Dog 1Cat 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 

내가지도

은 모두 DogAnimalHome 클래스에 Cat, 나는 다음과 같은 예외를 얻을. Dog '을 입력하여 'MyNamespace를 입력하십시오. Cat '.

이 캐시가 해당 유형으로 DogCat를 구분하지 않습니다 있는게 틀림 없어. 그냥 Animal 1으로 생각하고 Cat 1Dog 1과 같습니다.

어떻게 든 실제 서브 클래스를 고려하여 캐시를 만들 수 있습니까? 또는 table-per-subclass 구조에서이 작업을 수행 할 수없는 경우이 테이블 매핑에 어떻게 접근해야합니까?

답변

1

나는 Discriminator를 버림으로써 이것을 해결했다. Where 내 경우에는 Dog 또는 Cat을 내 코드에 Animal으로 처리 할 필요가 없으므로 매핑이 내 경우에 더 적합합니다. Animal- 관련 매핑을 상속하여 코드 복제를 최소한으로 유지합니다.

public class AnimalMap<T> : ClassMap<T> 
    where T : Animal 
{ 
    public AnimalMap() 
    { 
     Table("MyAnimals"); 
     Id(x => x.ObjectId); 
     Map(x => x.Data); 
    } 
} 

public class CatMap : AnimalMap<Cat> 
{ 
    public CatMap() 
    { 
     Where("TypeId = 10"); 
    } 
} 

캐시는 이제 CatDog 아니라는 것을 잘 알고 있습니다.