NHibernate抛出“无法解析属性:”,但属性不存在* ANYWHERE *在项目中

时间:2012-05-04 20:39:34

标签: c# nhibernate nhibernate-mapping

我对nHibernate有一个奇怪的问题......我得到了这个例外:

Unable to resolve property: _Portal

当我尝试提交对象图时。奇怪的是,当我搜索整个解决方案时,我似乎在项目中没有这个特定的属性 ANYWHERE

是否有人遇到过这种特殊情况,如果有,他们做了什么来解决?

5 个答案:

答案 0 :(得分:6)

在将nHibernate升级到3.3(从3.1)以及相关库(包括FluentNhibernate)后,我遇到了同样的问题。我有一个带有子集合的父对象,并且在修改子集合时,它将抛出您收到的相同异常(使用不存在的“_Namespace”属性名称,其中“Namespace”是我实际命名空间的第一部分)。 / p>

在我们的例子中,切换到SaveOrUpdate()不是一个选项,因为我们实际上在会话中加载了此对象的一个​​版本,因此我们需要Merge()。

我不知道可能有什么其他相似之处。对我们来说,它是一个带有子集合的父对象,使用FluentNhibernate。父对象的映射是子级的Cascade.AllDeleteOrphan(),以及父级的子级Cascade.None()。

不幸的是我找不到任何关于这个bug的其他报告,所以我们的解决方案就是恢复到nHibernate 3.1(以及相关的二进制文件,如FluentNhibernate和Iesi.Collections)。这是唯一的变化,然后再次正常工作。

更新了JIRA [3234]中记录的错误。

在JIRA中记录了此错误。该问题尚未得到任何优先考虑。也许如果您遇到此问题,可以创建一个帐户并投票以修复要修复的错误https://nhibernate.jira.com/browse/NH-3234

针对错误JIRA发布的变通方法更新[3234]。

根据Ondrej对该错误的评论,使用此代码覆盖会话配置上的默认合并侦听器解决了此问题。我确信已发布的解决方法很快就会正式修复。

public class UniDirectionalMergeFixListener : DefaultMergeEventListener
{
    protected override IDictionary GetMergeMap(object anything)
    {
        var cache = (EventCache)anything;
        var result = IdentityMap.Instantiate(cache.Count);

        foreach (DictionaryEntry entry in cache)
            result[entry.Value] = entry.Key;

        return result;
    }
}

答案 1 :(得分:1)

所以我解决了我的问题,但我不确定这是解决方案的原因。

在我的项目中,我已经抽象出使用nHibernate进入它自己的项目(* .Objects.nHibernate是命名空间)。我之所以这样做是因为我使用的客户端通常不喜欢使用nHibernate,我正试图让它们使用它。

发生的事情是该项目有一些数据模型只附加在系统中......例如,我们从不进行更新。因此,我的“存储库”必须考虑到这一点。

在我的存储库中的Commit()函数中,我序列化对象图,然后对其进行反序列化以制作要保存的对象的副本。我正在做的是对会话“_Session.Merge(...)”说,当我需要说“_Session.SaveOrUpdate(...)”来让事情正确地提交到数据库时...不确定为什么有所作为,但这是过去两天的答案。

THX。 Rippo& Nickolay!

答案 2 :(得分:1)

此问题的解决方法是从DefaultMergeEventListener派生并覆盖以下方法,如下所示:

    protected override IDictionary GetMergeMap(object anything)
    {
        var cache = (EventCache) anything;

        var result = IdentityMap.Instantiate(cache.Count);

        foreach (DictionaryEntry entry in cache)
        {
            result[entry.Value] = entry.Key;
        }

        return result;
    }

然后在构造SessionFactory时简单地使用此自定义事件侦听器。我已在相关的NHibernate错误报告中发布了其他详细信息:NH-3234

答案 3 :(得分:0)

很少要检查: -

  1. 您的域名是否有名为_Portal的支持字段?
  2. 您的解决方案中的任何地方都存在WORD portal吗?
  3. 做一个干净的解决方案,看看你的任何BIN文件夹中剩下哪些DLL。
  4. 您的NHibernate配置在构建后是否已序列化?如果是,请检查您使用的是最新版本。
  5. HTH

答案 4 :(得分:0)

还有一个想法。 NHibernate允许您在映射中指定如何访问您的支持字段或属性。例如<property access="nosetter.pascalcase-underscore" name="Timestamp" />将使NHibernate通过字段_Timestamp设置值。你的映射中是否有这样的访问说明符?