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 подумал: "Хорошо, это не та же коллекция, поэтому этот объект грязный, поэтому обновите версию и начните каскадировать эти изменения.

Этот вопрос, который я задал, суммирует дилеммы, с которыми я боролся, но теперь, похоже, решил: подход к работе с бизнес-коллекциями

Другие вопросы по тегам