C# 通过NHibernate 4升级打破变化

C# 通过NHibernate 4升级打破变化,c#,nhibernate,hbm,nhibernate-3,nhibernate-4,C#,Nhibernate,Hbm,Nhibernate 3,Nhibernate 4,我可以看到什么是新的和固定的 我想知道是否有人对hbm映射从NHibernate 3升级到4有意见 我担心这些天会有更多的注意力集中在流畅的绘图上。我可以测试更明显的突破性变化,但我想知道,在生产环境中,是否有任何人遇到过最初可能不太明显的细微问题 这看起来像是一次重大升级,您可能会认为会有倒退的风险。我不会太担心hbm本身。FluentNHibernate“编译”为XML,并通过映射层。NHibernate自己的代码映射也使用与hbm文件相同的部分代码 无论如何,映射代码没有太大变化。任何回归

我可以看到什么是新的和固定的

我想知道是否有人对hbm映射从NHibernate 3升级到4有意见

我担心这些天会有更多的注意力集中在流畅的绘图上。我可以测试更明显的突破性变化,但我想知道,在生产环境中,是否有任何人遇到过最初可能不太明显的细微问题


这看起来像是一次重大升级,您可能会认为会有倒退的风险。

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


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

仅供参考,我发现了一个新的错误。我们使用按代码映射,并且我们曾经有一个实体,该实体具有多个Bag映射,其Fetch类型设置为Join,使用NHibernate v 3.3.x。这在4.0.x版中不再允许


我们收到了一条错误消息,
无法同时取回多个行李。
,这在幕后是有必要的,但从技术上讲,这应该被视为一个突破性的变化。NHibernate没有很好地告诉我们是哪个映射导致了问题。

我们遇到了同样的问题,有一个相当大的
查询量
-
无法同时获取多个行李,NHibernate 4和FluentNhibernate映射

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

根据评论中的要求,以下是异常前后我们映射的一个小样本:

这是我们类的一个非常简化的展示,它导致
无法同时获取多个包。抽象的
实体
类。在改变之前,它看起来像这样

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();
}

因此,映射上的
ISet
和显式
AsSet()
解决了这个问题。这个代码片段非常简单,我们在
HasMany()
IList
QueryOver
中有多个实体-当所有这些都更新到
ISet
时,它工作正常。

这是一个公平的问题,但还是一个民意测验。一个公平的评论,我更准确地表达了我的担忧。我喜欢这个暂停功能,这是我第一次遇到它,它比旧的简单关闭要好得多。好的一点,点击这个,但后来意识到这是一个很好的弃用。您的查询可能是低效的,并带回大量数据表,考虑使用期货。显然, SET/CODE >知道在同一批中进行单独的查询,因此不应该与像Cuth.Bug < /Cult> S这样的笛卡尔积有问题。也使用代码映射,无法获得EnUM映射正确工作。(如果需要的话,可以使用SQLite)。它在保存期间工作正常,但使用Get检索不起作用-它似乎试图转换字符串“System.Byte[]”到枚举类型,这当然不起作用。在任何地方都找不到好的引用。@jweyrich,我对枚举没有任何问题。我有一个类的ID属性映射到列,没有其他东西。工作正常。创建一个问题并发送链接给我,我会看看我是否能帮上忙。使用FluentNHibernate,它就像一个符咒一样工作。使用ut it。无论如何,我现在已经切换到Fluent。无论如何,感谢您的支持。您有旧/新映射的示例吗?@AlexeyZimarev当然,我已经用之前和之后的示例更新了我的答案。希望这对您和其他人有所帮助:)
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
}