【问题标题】:Upgraded NHibernate and FNH DLLs - now getting "No persister" exceptions升级的 NHibernate 和 FNH DLL - 现在出现“无持久性”异常
【发布时间】:2011-11-08 07:46:08
【问题描述】:

我正在尝试将我的 FNH Automapping 项目升级到最新版本的 NHibernate 和 Fluent NHibernate(NH 3.2 和 FNH 1.3),但现在我在派生类上遇到“无持久性”异常(尽管基类仍然似乎已正确持久化)。

这个派生类 Automapped 与旧的 dll(FNH 1.0,NH 2.1.2)很好 - 我没有以任何方式更改我的映射逻辑或这些类。

我通过将新的 dll 复制到旧的 dll 上来升级我的项目,并删除新 dll 对不再需要的 dll 的引用(例如 Antlr 3、Castle)。

我正在使用的确切版本:

NHibernate 3.2.0.4000
FluentNHibernate 1.3.0.0
System.Data.SQLite 1.0.76.0
VS 2008 9.0.30729.1 SP
Windows XP SP3(32 位)

适用于旧 dll 但不适用于新 dll 的映射代码:

            return AutoMap.Assemblies(_assemblies)
                // Don't map the abstract base class
                .IgnoreBase<OfeEntity>()

                // Only map subclasses of OfeEntity
                .Where(t => t.IsSubclassOf(typeof(OfeEntity)))

                .Conventions.Add(
                    // Do cascading saves on all entities so lists  will be
                    // automatically saved 
                    DefaultCascade.All(),

                    // Turn on lazy loading, so will only read data that is actually
                    // displayed
                    DefaultLazy.Always()
                );

编辑:

打开 FNH 诊断后,我可以看到 FNH 没有使用新的 dll 为我的派生类创建表。

另外,我注意到一件事 - 没有被持久化的类被分为 2 个级别。也就是说,我有以下类:

public abstract class OfeEntity

public class OfeMeasurementBase : OfeEntity

public class OfeDlsMeasurement : OfeMeasurementBase

OfeDlsMeasurement 是没有被持久化的类。 OfeMeasurementBase 以及从 OfeEntity 继承的其他几个类正在正确持久化。

旧版本对此没有问题 - 新版本可能在多级继承时出现错误?

【问题讨论】:

  • 什么时候遇到这个异常?在构建会话工厂时?
  • 尝试保存或更新时出现异常。

标签: nhibernate fluent-nhibernate nhibernate-mapping


【解决方案1】:

我将我们的项目从一些较旧的 (F)NH 迁移到最新的 NH 3.2。我怀疑它现在在集合等中使用不同的键字段名称,因为我需要在使用现有数据库时指定确切的列名。

另外,我建议使用 NHibernate 3.2 从源代码重建 Fluent NHibernate,以确保一切顺利。

【讨论】:

    【解决方案2】:

    文章How to upgrade your apps to NHibernate 3.2 with Fluent NHibernate 1.2 可能会有所帮助。我自己用它来升级一个项目,它成功了。

    【讨论】:

    • 谢谢,希望我在开始这篇文章时能找到那篇文章!一个问题 - 我真的需要明确设置默认代理工厂吗?试过了,得到“无法找到 DefaultProxyFactoryFactory”的编译错误。
    • 这似乎是必要的。在我的项目中,当我将其排除在外时,会出现“无效或不完整的配置”异常。我认为 Fluent 使用 NHibernate.ByteCode.Castle 作为默认值,这不再包含在 3.2
    猜你喜欢
    • 1970-01-01
    • 2015-04-18
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多