我想知道是否有人对从 NHibernate 3 升级到 4 的 hbm 映射有问题?
我担心这些天更多的注意力集中在流畅的地图上。我可以测试更明显的重大变化,但想知道是否有人在生产环境中遇到过任何一开始可能不那么明显的微妙问题。
它看起来像是一次重大升级,您预计会有回归的风险。
我想知道是否有人对从 NHibernate 3 升级到 4 的 hbm 映射有问题?
我担心这些天更多的注意力集中在流畅的地图上。我可以测试更明显的重大变化,但想知道是否有人在生产环境中遇到过任何一开始可能不那么明显的微妙问题。
它看起来像是一次重大升级,您预计会有回归的风险。
仅供参考,我发现抛出了一个新错误。我们使用按代码映射,我们曾经有一个实体,它有多个Bag
映射,Fetch
类型设置为Join
NHibernate v 3.3.x。在 4.0.x 版本中不再允许这样做。
我们收到了 的错误消息Cannot simultaneously fetch multiple bags.
,这对于幕后的必要性是有意义的,但从技术上讲,它应该被视为一项重大更改。NHibernate 不能很好地告诉我们是哪个映射导致了这个问题。
我们在使用 Nhibernate 4 和 FluentNhibernate 映射QueryOver
时遇到了同样的问题。Cannot simultaneously fetch multiple bags
解决方案是在我们的 FluentMaps 上设置AsSet()
(根据我们的支持字段),最终解决了这个问题。
根据评论中的要求,以下是我们在异常之前和之后的映射的一个小样本:
这是我们课程的一个非常简化的展示,它导致了Cannot simultaneously fetch multiple bags
. 抽象Entity
类属于 S#Arp lite 架构。在更改之前它看起来像这样
public class OrderHeader : Entity
{
public virtual IList<OrderItem> 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<OrderHeader>
{
Id( e => e.Id).GeneratedBy.Native();
HasMany(e => e.OrderItems).Inverse();
}
public class OrderItemMap : ClassMap<OrderItem>
{
Id(e => e.Id).GeneratedBy.Native();
References(e => e.Header).Not.Nullable();
}
如您所见,OrderHeader 有一个IList
项目。将此更改为
public class OrderHeader : Entity
{
public virtual ISet<OrderItem> 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<OrderHeader>
{
Id( e => e.Id).GeneratedBy.Native();
HasMany(e => e.OrderItems).Inverse();
}
public class OrderItemMap : ClassMap<OrderItem>
{
Id(e => e.Id).GeneratedBy.Native();
References(e => e.Header).Not.Nullable().AsSet(); // Explicit AsSet
}
因此,映射上ISet
的明确说明使问题消失了。AsSet()
此代码片段非常简化,我们在QueryOver
with中有多个实体HasMany()
IList
- 当所有实体都更新为 时ISet
,它可以正常工作。
我不会太担心 hbm 本身。FluentNHibernate “编译”为通过映射层的 XML。NHibernate 自己的按代码映射也使用与 hbm 文件相同的部分代码。
无论如何,映射代码并没有太大变化。任何回归都更有可能出现在其他部分。