C# NHibernate投掷“;无法解析属性“,”;,但房地产没有';项目中不存在*任何地方*

C# NHibernate投掷“;无法解析属性“,”;,但房地产没有';项目中不存在*任何地方*,c#,nhibernate,nhibernate-mapping,C#,Nhibernate,Nhibernate Mapping,我和nHibernate有个奇怪的问题。。。我得到一个例外: Unable to resolve property: _Portal 当我尝试提交对象图时。奇怪的是,当我搜索整个解决方案时,我似乎在项目中的任何地方都没有这个特定属性 有人遇到过这种特殊情况吗?如果有,他们是如何解决的?需要检查的几件事:- 您的域中是否有名为_Portal的支持字段 您的解决方案中是否存在“门户”一词 做一个干净的解决方案,看看你的任何BIN文件夹中还剩下什么DLL 您的NHibernate配置在构建之后是否被

我和nHibernate有个奇怪的问题。。。我得到一个例外:

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

有人遇到过这种特殊情况吗?如果有,他们是如何解决的?

需要检查的几件事:-


  • 您的域中是否有名为_Portal的支持字段
  • 您的解决方案中是否存在“门户”一词
  • 做一个干净的解决方案,看看你的任何BIN文件夹中还剩下什么DLL
  • 您的NHibernate配置在构建之后是否被序列化?如果是,请检查您使用的是最新版本

  • 还有一个主意。NHibernate允许您在映射中指定如何访问支持字段或属性。例如,
    将使NHibernate通过字段\u时间戳设置值。您的映射中有这样的访问说明符吗?

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

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

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

    在存储库中的Commit()函数中,我序列化对象图,然后对其进行反序列化,以创建对象的副本以进行保存。我所做的是对会话说“\u session.Merge(…)”,而我需要说“\u session.SaveOrUpdate(…)”,以便将内容正确地提交到数据库。。。不确定为什么会有不同,但这就是过去两天的答案


    Thx。感谢你的帮助里波和尼科莱

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

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

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

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

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

    JIRA中记录了一个错误。这一问题尚未得到任何优先考虑。也许如果您遇到这个问题,您可以创建一个帐户并投票决定修复该错误。

    针对bug 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;
        }
    }
    

    此问题的解决方法是从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 bug报告中发布了更多详细信息:

    我想您知道哪些实体存在问题,那么实体、映射和db表模式看起来如何?@nemesv这是一个对象图。。。大约8种对象类型,包含6*.hbm.xml文件。。。我应该在这里发布所有内容吗?可能是一个愚蠢的评论,但是当你搜索整个项目时,你确定你的文件掩码是**不仅仅是*.cs或其他更严格的东西?我在C#中使用VS.Net,我通过“整个解决方案”以及“仅这些打开的文档”完成了这项工作,重点是图形中的类。我在看了一些我发现问题的东西后思考。只是希望不是那么愚蠢!您的域中是否有名为_Portal的支持字段?1)其中一个名称空间是Portal.*,但没有名为_Portal的支持字段。2) 见#1。3) “清理”将清理整个项目。没有文件了。4) 我用的是nuget的最新版本不。。。我没有对解决方案中的任何“属性”使用访问属性。嘿。。不幸的是,我使用NHibernate的项目是我使用该工具完成的第一个可部署项目。我还没有意识到,当内存中有对象时,不能执行SaveOrUpdate()。到目前为止,它似乎在为我工作。因此,疼痛开始起作用。。。我无法得到一个深度对象图来“克隆”,然后再“保存”。我需要解决这个问题是的。。。看来我要退后了。这帮我节省了更多的时间。非常感谢。Brain==Fried有关解决方法,请参见我对该问题的回答: