我需要使用 Fluent NHibernate 映射旧表。我无法控制表结构。
该表如下所示:
TypeId ObjectId Data
10 1 ... //Cat 1
10 2 ... //Cat 2
20 1 ... //Dog 1
30 1 ...
我正在尝试使用每个子类的表结构使用TypeId
.
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");
}
}
当我尝试在Cat 1
之后加载时会出现问题Dog 1
,反之亦然。
var a = session.Get<Dog>(1); //Dog1
var b = session.Get<Cat>(1); //null
如果我在取第二只动物之前驱逐第一只动物,它会起作用。
var a = session.Get<Dog>(1); //Dog1
session.Evict(a);
var b = session.Get<Cat>(1); //Cat1
当我将 aDog
和 a都映射Cat
到我的AnimalHome
班级时,我得到以下异常:
无法转换类型为“MyNamespace”的对象。Dog ' 输入 'MyNamespace. 猫'。
这让我相信缓存并没有区分Dog
它们Cat
的类型。它只是认为它是Animal 1
and that Cat 1
equalsDog 1
。
我可以以某种方式让缓存考虑实际的子类吗?或者,如果这对于每个子类的表结构是不可能的,我应该如何映射这个表?