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

本文关键字:属性 项目 不存在 任何地 抛出 NHibernate | 更新日期: 2023-09-27 18:33:09

我在 nHibernate 上遇到了一个奇怪的问题......我收到此异常:

Unable to resolve property: _Portal

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

有没有人遇到过这个特殊案例,如果是,他们做了什么来解决?

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

在将 nHibernate 从 3.1 升级到 3.3 以及相关库(包括 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 对该错误的评论,使用此代码覆盖会话配置的默认合并侦听器现在可以解决问题。我相信随着解决方法的发布,它将很快正式修复。

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;
    }
}

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

在我的项目中,

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

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

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

感谢您对Rippo & Nickolay的帮助!

此问题的解决方法是从 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

要检查的几件事:-

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

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