想象一下,我们有这样的实体,那么怎么可能在nHibernate中映射这些所有的类呢?
public interface ISomeone
{
}
public abstract class Parent
{
}
public class Child : Parent , ISomeone
{
}
public class Orphan : ISomeone
{
}
public class MyHeart
{
public ISomeone Person {get;set;}
}
我更倾向于为 "Parent","Orphane "和 "MyHeart "类使用单独的表。"Parent","Orphan "和 "MyHeart "应该作为aggrigate root持久化,MyHeart可以与任何实现 "ISomeone "接口的实体有关系,所以它可以在不同的实体类型中用不同的ID在不同的表中扩展。
最后,我找到了解决方案,"Any "方法就是答案,简单的说,通过这个方法,我们为IPerson在另一个世界的每一个可能的值定义了一些元值,每一个实现这个接口的类都应该在 "Any "方法中定义,然后nHibernate将Id和MetaValue持久化。
在我的例子中,代码的映射是这样的。
public class MyHeartMapping : ClassMapping<MyHeart>
{
public MyHeartMapping()
{
Id(x => x.Id, x => x.Generator(Generators.Native));
Any(p => p.Person, typeof(long), m => {
m.MetaValue("Child", typeof(Child));
m.MetaValue("Orphane", typeof(Orphane));
m.Columns(i => i.Name("PersonId"), c => c.Name("ClassName")); });
}
}
public class ParentMapping : ClassMapping<Parent>
{
public ParentMapping()
{
Id(x => x.Id, x => x.Generator(Generators.Native));
Discriminator(c => c.Column("Discriminator"));
}
}
public class ChildMapping : SubclassMapping<Child>
{
public ChildMapping()
{
DiscriminatorValue("Child");
}
}
public class OrphaneMapping : ClassMapping<Orphane>
{
public OrphaneMapping()
{
Id(x => x.Id, x => x.Generator(Generators.Native));
}
}