在NHibernate 3.3中映射继承

时间:2012-05-18 16:03:22

标签: nhibernate mapping-by-code

我有下面描述的继承:

public abstract class BaseEntity<TId> {....}

public abstract class ModelEntity : BaseEntity<Int32>{....}

public abstract class AuditableEntity : ModelEntity,IAuditable{....}

public class ApplicationUser : AuditableEntity{....}

public class SuperUser : ApplicationUser

我正在使用NHibernate 3.3,我想创建该继承的映射

public abstract class ModelEntityMap<TEntity> : ClassMapping<TEntity>
        where TEntity : ModelEntity
{...}

public class AuditableEntityMap<TEntity> : ModelEntityMap<TEntity> where TEntity : AuditableEntity
{ ...}

public class ApplicationUserMap : AuditableEntityMap<ApplicationUser>
{...}

public class SuperUserMap : JoinedSubclassMapping<SuperUser>{...}

当应用程序启动并尝试设置数据库时,会引发以下异常: SuperUser的模糊映射找到了多个根实体BaseEntity / ApplicationUser

可能的解决方案 -Merge根实体的映射表示层次结构中的真实根 - 使用逻辑注入IModelInspector以发现真正的根实体。

我使用Fluent nhibernate具有相同的继承,并且使用定义为的SuperUserMap工作得很好 公共类SuperUserMap:SubClassMap {...}

我是代码的Nhibernate映射新手,非常困惑!!!

3 个答案:

答案 0 :(得分:0)

我相信有两种方法可以解决这个问题: a)使用鉴别器的概念来识别存储的类的类型,从而从数据库中检索正确的对象,在这种情况下,您的类被映射到具有所有列和鉴别器列的表。不确定这是如何使用多级继承,但这是你可以谷歌。

b)看看这篇关于他如何处理继承的帖子:http://fabiomaulo.blogspot.co.nz/2011/04/nhibernate-32-mapping-by-code_13.html你可能会想到解决你的问题。

答案 1 :(得分:0)

您可以通过覆盖用于创建映射的模型映射器的IsRootEntity逻辑来影响实体是否为根实体的决策。

这是一个定义默认NHibernate逐个代码行为的示例:

03 03 03

您必须调整此决策逻辑,以将BaseEntity类排除为可能的根实体。

答案 2 :(得分:0)

我在NHibernate 4。1。1(2017年5月)中遇到此错误,所以我正在回答我是如何解决它以供将来参考的

就我而言,我复制了一个继承类的现有映射,忘了将父映射类更改为ClassMapping并遇到同样的错误

换句话说,在您的映射类中,检查父类,确保它是ClassMappingJoinedSubclassMapping,如果它是子类