随着NHibernate 4升级而破坏变化

我可以在NHibernate 4.0中看到新的和修复过的东西

我想知道是否有人遇到从NHibernate 3升级到4的hbm映射问题?

我担心这些日子会更加注重流畅的绘图。 我可以测试更明显的重大变化,但想知道是否有任何人在生产环境中遇到的任何细微问题,起初可能并不那么明显。

它看起来像是一次重大升级,你可能会有回归的风险。

仅供参考,我发现了一个新的错误。 我们使用Mapping By Code,我们曾经有一个具有多个Bag映射的实体,其Fetch类型设置为Join with NHibernate v 3.3.x. 版本4.0.x中不再允许这样做。

我们收到一条错误消息, Cannot simultaneously fetch multiple bags. 这对幕后的必要条件有意义,但在技术上应该被认为是一个突破性的变化。 NHibernate不足以告诉我们哪个映射导致了这个问题。

我们遇到了一个相当大的QueryOverCannot simultaneously fetch multiple bags ,使用Nhibernate 4和FluentNhibernate映射。

解决方案是在我们的FluentMaps上设置AsSet() (根据我们的支持字段),这最终解决了问题。

根据评论中的请求,以下是exception之前和之后的一小部分映射示例:

这是我们课程的一个非常简化的展示,导致Cannot simultaneously fetch multiple bags 。 抽象Entity类属于S#Arp lite体系结构 。 在变化之前它看起来像这样

 public class OrderHeader : Entity { public virtual IList Items { get; set; } } public class OrderItem : Entity { public virtual decimal Price {get; set;} public virtual string ItemNumber {get; set;} public virtual OrderHeader Header {get; set;} } public class OrderHeaderMap : ClassMap { Id( e => e.Id).GeneratedBy.Native(); HasMany(e => e.OrderItems).Inverse(); } public class OrderItemMap : ClassMap { Id(e => e.Id).GeneratedBy.Native(); References(e => e.Header).Not.Nullable(); } 

如您所见,OrderHeader具有IList项。 将此更改为

 public class OrderHeader : Entity { public virtual ISet Items { get; set; } // ISet here } public class OrderItem : Entity { public virtual decimal Price {get; set;} public virtual string ItemNumber {get; set;} public virtual OrderHeader Header {get; set;} } public class OrderHeaderMap : ClassMap { Id( e => e.Id).GeneratedBy.Native(); HasMany(e => e.OrderItems).Inverse(); } public class OrderItemMap : ClassMap { Id(e => e.Id).GeneratedBy.Native(); References(e => e.Header).Not.Nullable().AsSet(); // Explicit AsSet } 

因此, ISet和映射上的显式AsSet()使问题消失了。 这个代码片段非常简单,我们在QueryOver有多个实体和HasMany() IList – 当所有实体都更新到ISet ,它运行正常。

我不会太担心hbm本身。 FluentNHibernate“编译”到通过映射层的XML。 NHibernate自己的代码映射也使用与hbm文件相同代码的部分。

无论如何,映射代码没有太大变化。 任何回归都更可能出现在其他部分。