如何在nHibernate中映射一个继承了asbtract类并同时实现一个接口的calss?

问题描述 投票:0回答:1

想象一下,我们有这样的实体,那么怎么可能在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在不同的表中扩展。

c# nhibernate orm nhibernate-mapping
1个回答
1
投票

最后,我找到了解决方案,"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));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.