随着NHibernate 4的升级而破坏变化

dov*_*ove 4 c# nhibernate hbm nhibernate-3 nhibernate-4

我可以在NHibernate 4.0中看到新的和修复的内容

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

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

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

ps2*_*oat 8

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

我们收到了一条错误消息Cannot simultaneously fetch multiple bags.,这对于幕后必要的内容是有意义的,但从技术上来说,它应该被认为是一个重大改变.NHibernate还不足以告诉我们哪个映射导致了这个问题.


nov*_*ver 5

我们在使用 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();
}
Run Code Online (Sandbox Code Playgroud)

如您所见,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
}
Run Code Online (Sandbox Code Playgroud)

因此,映射上ISet的显式和显式AsSet()使问题消失了。此代码片段非常简化,我们在QueryOverwith 中有多个实体HasMany() IList- 当所有实体都更新到 时ISet,它可以正常工作。


Osk*_*ren 3

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

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