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

时间:2014-08-22 15:30:04

标签: c# nhibernate hbm nhibernate-3 nhibernate-4

我可以在NHibernate 4.0

中看到新内容和修正内容

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

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

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

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:4)

我们在使用Nhibernate 4和FluentNhibernate映射的QueryOver - Cannot simultaneously fetch multiple bags时遇到了同样的问题。

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

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

这是我们类的一个非常简化的展示,它引起了Cannot simultaneously fetch multiple bags。摘要Entitybelongs to the S#Arp lite architecture。在更改之前,它看起来像这样

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 HasMany() IList中有多个实体 - 当所有实体都更新为ISet时,它运行正常。

答案 2 :(得分:2)

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

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