在nHibernate中如何映射一个继承一个抽象class同时实现一个接口的类?

How to map a calss that inherits an asbtract class and implements an interface at the same time in 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;}
}

那么如何在 nhibernate 中映射所有 classes? 我更喜欢为 "Parent"、"Orphane" 和 "MyHeart" class 使用单独的表格。 "Parent" 、 "Orphan" 和 "MyHeart" 应该作为聚合根持久存在,并且 MyHeart 可以与实现 "ISomeone" 接口的任何实体有关系。因此它可以扩展到具有不同 id 的不同实体类型,形成不同的表

我终于找到了解决办法 "Any" 方法就是答案,通过这种方法,我们为另一个世界中 IPerson 的每个可能值定义了一些元值,每个实现此接口的 class 都应该在 "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));
    }
}