具有Fluent NHibernate的子类的不同序列

具有Fluent NHibernate的子类的不同序列,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Mapping,我使用Fluent NHibernate和table per-concrete类进行继承映射 有一个抽象基类和另外两个子类 我的基类有Id列。创建的表是可以的。所有表都有自己的Id列。但这两张表的顺序只有一个 我想为每个子类分配不同的序列 public abstract class Base { public virtual int Id { get; set; } } public class BaseMap : ClassMap<Base> { public B

我使用Fluent NHibernate和table per-concrete类进行继承映射

有一个抽象基类和另外两个子类

我的基类有Id列。创建的表是可以的。所有表都有自己的Id列。但这两张表的顺序只有一个

我想为每个子类分配不同的序列

public abstract class Base
{
    public virtual int Id { get; set; }
}

public class BaseMap : ClassMap<Base>
{
    public BaseMap()
    {
        Id(x => x.Id).GeneratedBy.Native();
    }
}

public class A : Base
{
    public virtual int AmountOfA { get; set; }
}

public class AMap : ClassMap<A>
{
    public AMap()
    {
        Map(x => x.AmountOfA );
    }
}

public class B : Base
{
    public virtual int AmountOfB { get; set; }
}

public class BMap : ClassMap<B>
{
    public BMap()
    {
        Map(x => x.AmountOfB );
    }
}
公共抽象类基类
{
公共虚拟整数Id{get;set;}
}
公共类基本映射:类映射
{
公共底图()
{
Id(x=>x.Id).GeneratedBy.Native();
}
}
公共A类:基本类
{
公共虚拟整数AmountOfA{get;set;}
}
公共类AMap:ClassMap
{
公共AMap()
{
Map(x=>x.AmountOfA);
}
}
B类公共服务:基本服务
{
公共虚拟int AmountOfB{get;set;}
}
公共类BMap:ClassMap
{
公共BMap()
{
Map(x=>x.fb);
}
}
使用Fluent NHibernate是否可以做到这一点?

这是出于设计

  • session.Get(1)将具有未定义的行为,因为id不是唯一的

  • 考虑有对基类
    reference(x=>x.SomeBase)的引用的情况:无法知道a(Id:1)或B(Id:1)是引用的对象

如果Base只是用于重用Id属性,那么不要将其映射为自己的实体,而是创建一个基类

public class BaseMap<T> : ClassMap<T> where T : Base
{
    public BaseMap()
    {
        Id(x => x.Id).GeneratedBy.Native();
    }
}

public class AMap : BaseMap<A>
{
    public AMap()
    {
        Map(x => x.AmountOfA );
    }
}
public类BaseMap:ClassMap其中T:Base
{
公共底图()
{
Id(x=>x.Id).GeneratedBy.Native();
}
}
公共类AMap:基本映射
{
公共AMap()
{
Map(x=>x.AmountOfA);
}
}

您使用的是什么数据库?我的基类是抽象的。所以数据库中并没有基表,在我的示例中也并没有用于基类的表。但是,您可以查询基类并获取bth子类的对象。我的所有类都在扩展我使用的基类用于常见字段,如版本、记录日期vs。在您的设计中,我的所有实体将共享相同的序列。这是我首先不想要的。然后使用我的第二种方法。根本不映射基类,而是创建一个基类映射,如图所示,用于公共属性