2014-08-22 11 views
3

я могу увидеть, что нового и фиксируется в NHibernate 4.0отличиях с NHibernate 4 обновления

Я хотел бы знать, если кто имеет проблемы с обновлением HBM отображений из NHibernate 3 до 4?

Я боюсь, что в наши дни больше внимания уделяется плавному отображению. Я могу проверить более очевидные изменения, но хотел бы знать, есть ли какие-то тонкие проблемы, с которыми сталкивается кто-либо в производственной среде, которая может быть не столь очевидной вначале.

Это похоже на серьезное обновление, и вы ожидаете, что существует риск регрессий.

+1

Справедливый вопрос, но опрос, тем не менее. –

+0

Прекрасный комментарий, я более точно сформулировал свою заботу. Мне нравится эта функция удержания, это моя первая встреча, и она намного лучше, чем старая просто закрыта. – dove

ответ

2

Я бы не стал слишком беспокоиться о самом hbm. FluentNHibernate «компилируется» в XML, который проходит через слой отображения. Собственный картографический код NHibernate также использует части того же кода, что и hbm-файлы.

Во всяком случае, код отображения не сильно изменился. Любые регрессии, скорее всего, будут в других частях.

8

FYI, я нашел новую ошибку, которая была выброшена. Мы используем Mapping By Code, и мы имели обыкновение иметь сущность с несколькими сопоставлениями Bag с типом Fetch, установленным в Join с NHibernate v 3.3.x. Это больше не допускается в версии 4.0.x.

Мы получили сообщение об ошибке Cannot simultaneously fetch multiple bags., что имеет смысл с тем, что необходимо за кулисами, но его технически следует считать изменением. NHibernate был недостаточно хорош, чтобы сообщить нам, какое картографирование вызывает проблему.

+0

Хорошая точка, ударил тоже, но потом понял, что это хорошая усталость. ваши запросы, скорее всего, будут неэффективными и возвратят большую таблицу данных, рассмотрите возможность использования фьючерсов. – dove

+0

По-видимому, 'Set' знает, как сделать отдельный запрос в той же партии, поэтому не должно быть проблем с декартовыми продуктами, такими как' Bag 's может иметь. – ps2goat

+0

Также, используя Mapping by Code, я не мог получить правильное отображение перечисления (используя SQLite, если это имеет значение). Он отлично работает во время сохранения, но поиск с Get не работает. Кажется, он пытается преобразовать строку «System.Byte []» в тип перечисления, что, конечно же, не сработает. Не удалось найти хорошую ссылку в любом месте. – jweyrich

4

Мы столкнулись с той же проблемой с довольно большим QueryOver - Cannot simultaneously fetch multiple bags, с сопоставлениями Nhibernate 4 и FluentNhibernate.

Решение было на наших FluentMaps, чтобы установить AsSet() (в соответствии с нашими полями поддержки), которые в конце концов решили проблему.

По запросу в комментариях, вот небольшой пример наших отображений до и после исключения:

Это очень упрощенная витрина наших классов, вызвавших Cannot simultaneously fetch multiple bags. Резюме Entity класс belongs 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, он работал правильно.

+0

У вас есть образец старых/новых сопоставлений? –

+0

@AlexeyZimarev Конечно, я обновил свой ответ примерами до и после. Надеюсь, это поможет вам и всем остальным :) – nover

 Смежные вопросы

  • Нет связанных вопросов^_^