4

我有下面描述的继承:

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

可能的解决方案 - 合并根实体的映射代表层次结构中的真实根 - 注入带有逻辑的 IModelInspector 以发现真正的根实体。

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

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

4

3 回答 3

0

我相信有两种方法可以解决这个问题:a)使用鉴别器的概念来识别存储的类的类型,从而从数据库中检索到正确的对象,在这种情况下,你的类被映射到一个包含所有列加上鉴别器列。不知道这如何与多级继承一起工作,但这是你可以用谷歌搜索的东西。

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

于 2012-05-19T10:29:46.997 回答
0

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

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

    var modelMapper = new ConventionModelMapper();
    modelMapper.IsRootEntity((type, declared) =>
    {
        if (declared) return true; // Type has already been declared as root entity
        return type.IsClass 
            && typeof(object) == type.BaseType 
            && modelMapper.ModelInspector.IsEntity(type);
    });

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

于 2017-03-13T20:39:24.300 回答
0

我在使用 NHibernate 4.1.1(2017 年 5 月)时遇到了这个错误,所以我正在回答我如何解决它以供将来参考

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

换句话说,在您的映射类中,检查父类,确保它是ClassMapping或者JoinedSubclassMapping它是否是子类

于 2017-05-24T16:46:26.327 回答