我正在尝试将我的FNH Automapping项目升级到最新版本的NHibernate和Fluent NHibernate(NH 3.2和FNH 1.3),但是现在我在派生类上得到了“no persister”异常(尽管基类仍然似乎是坚持不懈的。)
这个派生类使用旧的dll(FNH 1.0,NH 2.1.2)自动执行 - 我没有以任何方式更改我的映射逻辑或这些类。
我通过将新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的类正在被持久化。
旧版本对此没有任何问题 - 当有多个级别的继承时,新版本可能有错误吗?
答案 0 :(得分:1)
我将我们的项目从一些旧的(F)NH迁移到最新的NH 3.2。我怀疑它现在在集合中使用不同的关键字段名称,因为我需要在使用现有数据库时指定确切的列名。
另外,我建议使用NHibernate 3.2从源代码重建Fluent NHibernate,以确保一切都到位。
答案 1 :(得分:1)
文章How to upgrade your apps to NHibernate 3.2 with Fluent NHibernate 1.2可能会有所帮助。我自己用它来升级项目,但它确实有效。