NHIbernate двунаправленная проблема обновления вставки много ко многим
У меня есть класс Shape, который имеет отношение многие ко многим с Package. Смысл этого двунаправленного отношения состоит в том, что если Продукт имеет определенную Форму, он может быть Упакован Пакетами, с которыми связана Форма. Это также относится к обратному, если продукт упакован в пакет, это означает, что продукт должен иметь форму, связанную с этим пакетом.
Поэтому у меня есть доменная модель с Shape, содержащей пакеты, и Package, содержащий Shapes. Соответственно, отображение NH приводит к появлению таблицы Shape, Package и PackageToShape.
Однако когда я применяю управление версиями, это приводит к нескольким обновлениям и вставкам в таблицу PackageToShape. На самом деле, происходит следующее: например, ShapeId = 1, PackageId = 1 сначала удаляется, а затем вставляется снова! На самом деле я использую Guids. Но дело в том, что с этой настройкой NH создает несколько операторов удаления и вставки в таблицу "многие ко многим", сначала удаляя строку, а затем снова добавляя точно такую же строку!!
Есть ли способ предотвратить это?
Отображения (используя Fluent NH)
public sealed class ShapeMap: EntityMap<Shape, Guid, ShapeDto>
{
public ShapeMap()
{
HasManyToMany(s => s.Packages)
// Fetch.Join will raise laizy collection load error
.Fetch.Select()
.AsSet()
.Cascade.All();
HasManyToMany(s => s.UnitGroups)
// Fetch.Join will raise laizy collection load error
.Fetch.Select()
.AsSet()
.Cascade.All();
HasManyToMany(s => s.Routes)
// Fetch.Join will raise laizy collection load error
.Fetch.Select()
.AsSet()
.Cascade.All();
}
Сопоставление для пакета:
public class PackageMap : EntityMap<Package, Guid, PackageDto>
{
public PackageMap()
{
Map(p => p.Abbreviation).Not.Nullable().Length(30).Unique();
HasManyToMany(p => p.Shapes)
// Fetch.Join will raise laizy collection load error
.Fetch.Select()
.AsSet()
.Inverse()
.Cascade.All();
}
}
Карта сущностей реализует отображение идентификатора, имени (уникального) и версии.
1 ответ
Я обнаружил проблему. В установщиках коллекций я создал новые списки, и, видимо, этого нельзя сделать с NH. Я хотел представить свой внутренний HashSets как IEnumerable для внешнего мира, что, я думаю, является предпочтительным способом сделать это. В моих защищенных установках этих коллекций у меня был такой код:
protected set { _mySet = new HashSet(value); }
Вторая проблема, с которой я столкнулся, заключалась в том, что NH не поддерживает нативную сеть Dot 4 ISet. Вы должны реализовать предоставленный набор NH (Iesi.Collections.Generic.ISet).
Случилось так, что из-за того, что я создал новую внутреннюю коллекцию из коллекции, предоставленной NH, NH подумал: "Хорошо, это не та же коллекция, поэтому этот объект грязный, поэтому обновите версию и начните каскадировать эти изменения.
Этот вопрос, который я задал, суммирует дилеммы, с которыми я боролся, но теперь, похоже, решил: подход к работе с бизнес-коллекциями