nHibernate、自动映射和链接抽象类

nHibernate、自动映射和链接抽象类,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我在使用nHibernate、自动映射和使用多个抽象类链的类结构时遇到了一些问题 这是类似的东西 public abstract class AbstractClassA {} public abstract class AbstractClassB : AbstractClassA {} public class ClassA : AbstractClassB {} 当我尝试构建这些映射时,我收到以下错误 “未处理FluentNHibernate.Cfg.FluentConfigurat

我在使用nHibernate、自动映射和使用多个抽象类链的类结构时遇到了一些问题

这是类似的东西

public abstract class AbstractClassA {}

public abstract class AbstractClassB : AbstractClassA {}

public class ClassA : AbstractClassB {}
当我尝试构建这些映射时,我收到以下错误

“未处理FluentNHibernate.Cfg.FluentConfigurationException 消息:创建SessionFactory时使用了无效或不完整的配置。有关详细信息,请检查潜在原因集合和InnerException

  • 未通过数据库方法配置数据库。“
但是,如果我从AbstractClassB中删除abstract关键字,一切都会正常工作。只有在类层次结构中有多个抽象类时,才会出现此问题

我已经使用以下绑定类手动配置了自动映射,以包括AbstractClassA和AbstractClassB

public class BindItemBases : IManualBinding
{
    public void Bind(FluentNHibernate.Automapping.AutoPersistenceModel model)
    {
        model.IncludeBase<AbstractClassA>();
        model.IncludeBase<AbstractClassB>();
    }
}
公共类BindItemBase:IManualBinding
{
公共void绑定(FluentNHibernate.Automapping.AutoPersistenceModel模型)
{
model.IncludeBase();
model.IncludeBase();
}
}
我已经做了一些黑客来绕过这一点,但必须有一个更好的方法来让它工作。当然nHibernate支持这样的东西,我只是还没有弄清楚如何正确配置它

干杯


James

为什么要在自动映射中包含抽象类,它们是否也在数据库中显示?你能提供内部异常吗

model.IncludeBase<AbstractClassA>();
model.IncludeBase<AbstractClassB>();
model.IncludeBase();
model.IncludeBase();

有了这个功能,您就可以尝试将AbstractClassB映射到数据库,这可能不是您想要的。

为什么要在自动映射中包含抽象类,它们是否也显示在数据库中?你能提供内部异常吗

model.IncludeBase<AbstractClassA>();
model.IncludeBase<AbstractClassB>();
model.IncludeBase();
model.IncludeBase();

有了这个功能,您就可以尝试将AbstractClassB映射到数据库,这可能不是您想要的。

我想包括它们,因为有几个不同的类是从它们派生的。如果我去掉了抽象,一切都会很好,但我不想那样做。如果我不包括基,那么派生类将各自获得一个表。我不想那样。如果我让ClassA直接从AbstractClassA派生,那么事情就是按照我想要的方式工作的。当我在中间添加了ActhCaseCB时,为什么不把抽象AcExb从映射中排除,而将它作为基类来排除呢?如果我从映射中排除了AcExtCaseBB,我就得到了一个映射异常。从映射的角度来看,ClassA与任何抽象类之间都不应该有关联,所以请检查您的抽象类B是否没有被fluent映射。我想包括它们,因为有几个不同的类是从它们派生的。如果我去掉了抽象,一切都会很好,但我不想那样做。如果我不包括基,那么派生类将各自获得一个表。我不想那样。如果我让ClassA直接从AbstractClassA派生,那么事情就是按照我想要的方式工作的。当我在中间添加了ActhCaseCB时,为什么不把抽象AcExb从映射中排除,而将它作为基类来排除呢?如果我从映射中排除了AcExtCaseBB,我就得到了一个映射异常。从映射的角度来看,ClassA和任何抽象类之间都不应该有关联,所以请检查您的抽象类B是否没有被fluent映射。