4

我遇到了一个关于 nHibernate 的奇怪问题……我遇到了这个异常:

Unable to resolve property: _Portal

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

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

4

5 回答 5

6

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

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

我不知道还有什么相似之处。对我们来说,它是一个带有子集合的父对象,使用 FluentNhibernate。父对象上的映射对于子对象是 Cascade.AllDeleteOrphan(),对于子对象到父对象的映射是 Cascade.None()。

不幸的是,我找不到有关此错误的任何其他报告,因此我们的解决方案是恢复到 nHibernate 3.1(以及相关的二进制文件,如 FluentNhibernate 和 Iesi.Collections)。这是唯一的变化,然后它又可以正常工作了。

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

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

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

根据 Ondrej 对 bug 的评论,使用此代码覆盖会话配置上的默认合并侦听器可以暂时解决问题。我确信发布的解决方法将很快正式修复。

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;
    }
}
于 2012-05-08T15:59:51.047 回答
1

所以我解决了我的问题,但我不确定为什么这是解决方案。

在我的项目中,我已经将 nHibernate 的使用抽象化到它自己的项目中(*.Objects.nHibernate 是命名空间)。我这样做是因为与我一起工作的客户通常不喜欢使用 nHibernate,我正试图让他们使用它。

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

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

谢谢。为您的帮助 Rippo 和 Nickolay!

于 2012-05-07T15:24:33.063 回答
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

于 2014-01-16T10:53:10.837 回答
0

几件事情要检查: -

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

高温高压

于 2012-05-05T08:30:35.113 回答
0

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

于 2012-05-05T09:11:26.503 回答