2012-05-18 65 views
4

我在下面所描述的继承:映射继承3.3

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以发现真正的根实体。

我用流利的NHibernate的具有相同的继承和工作得很好定义为 公共类SuperUserMap SuperUserMap:SubClassMap {...}

我是新来NHibernate的映射的代码,并很困惑!

+1

有点晚这里的派对......但你最终如何解决这个问题? –

+0

现在是2016年,我坚持着同样的问题。 – Alexandr

回答

0

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

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

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类尽可能根实体。

0

我有这个错误与NHibernate 4.1.1(五月2017),所以我用我如何解决它以供将来参考

在我的情况回答,我复制继承类的现有映射,忘了父映射类更改为ClassMapping并遇到了同样的错误

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