NHibernate命名查询 - 如何忽略其公式定义映射的属性?

时间:2013-04-29 19:31:42

标签: nhibernate nhibernate-mapping

我可以配置一个NHibernate命名过程来在加载对象时跳过某些属性吗?这些不是我想要忽略的表中的列;它们是对象上与列不对应的属性,我想在使用命名过程时将它们保留为null。 (还有其他情况我想填充这些属性)。

我有一个Inspection对象,它从SQL表中读取了许多属性,并使用公式计算了一个属性:

...
<property name="InspectionDate" type="DateTime" not-null="false" />
<property name="LastCompletedDate" type="DateTime" not-null="false" 
            formula="(select max(.....long formula.....)"/>
...

当NHibernate加载检查时,这很好用。当我使用存储过程获取检查列表时会出现问题:

<sql-query name="GetOverdueInspection">
      <return class="Inspection" />
      exec dbo.usp_GetOverdueInspection :dueDate
</sql-query>

抛出异常:

10011 [10] INFO NHibernate.Loader.Loader (null) - exec dbo.usp_GetOverdueInspection @p0
NHibernate: exec dbo.usp_GetOverdueInspection @p0; @p0 = '4/29/2013 7:23:41 PM'10846 [10] 
WARN NHibernate.Util.ADOExceptionReporter (null) - System.ArgumentNullException: Value cannot be null.
Parameter name: fieldName
   at System.Data.SqlClient.SqlDataReader.GetOrdinal(String name)
   at NHibernate.Driver.NHybridDataReader.GetOrdinal(String name)
   at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name)
   at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner)
   at NHibernate.Type.AbstractType.Hydrate(IDataReader rs, String[] names, ISessionImplementor session, Object owner)
   at NHibernate.Persister.Entity.AbstractEntityPersister.Hydrate(IDataReader rs, Object id, Object obj, ILoadable rootLoadable, String[][] suffixedPropertyColumns, Boolean allProperties, ISessionImplementor session)
   at NHibernate.Loader.Loader.LoadFromResultSet(IDataReader rs, Int32 i, Object obj, String instanceClass, EntityKey key, LockMode lockMode, ILoadable rootPersister, ISessionImplementor session)
   at NHibernate.Loader.Loader.InstanceNotYetLoaded(IDataReader dr, Int32 i, ILoadable persister, EntityKey key, LockMode lockMode, EntityKey optionalObjectKey, Object optionalObject, IList hydratedObjects, ISessionImplementor session)
   at NHibernate.Loader.Loader.GetRow(IDataReader rs, ILoadable[] persisters, EntityKey[] keys, Object optionalObject, EntityKey optionalObjectKey, LockMode[] lockModes, IList hydratedObjects, ISessionImplementor session)
   at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, BooleanreturnProxies)
   at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)   at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
   at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
10849 [10] ERROR NHibernate.Util.ADOExceptionReporter (null) - Value cannot be null.
Parameter name: fieldName

如何在使用此命名查询时告诉NHibernate将LastCompletedDate保留为null?

1 个答案:

答案 0 :(得分:1)

您可以通过将您的属性LastCompletedDate映射为lazy来解决此问题。 这不是您问题的真正答案,只是您可以尝试的解决方法。 当然这意味着LastCompleteDate属性将始终延迟加载,这可能是一件坏事,具体取决于您的用例。

<property name="LastCompletedDate" type="DateTime" not-null="false" 
        lazy="true" formula="(select max(.....long formula.....)"/>

否则,我看到实现预期功能的唯一方法是使用基类,子类两次而不添加任何内容,使用公式映射一个子类而不使用另一个子类,并通过转换在代码中工作他们回到基类具有相同的类型。非常丑陋,可能有一些不好的弊端。