NHIbernate двунаправленная проблема обновления вставки много ко многим - PullRequest
1 голос
/ 23 августа 2011

У меня есть класс 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 Ответ

0 голосов
/ 25 августа 2011

Я обнаружил проблему. В установщиках коллекций я создал новые списки, и, видимо, этого нельзя делать с NH. Я хотел представить свой внутренний HashSets как IEnumerable для внешнего мира, что, я думаю, является предпочтительным способом сделать это. В моих защищенных установках этих коллекций у меня был такой код:

protected set { _mySet = new HashSet(value); }

Вторая проблема, с которой я столкнулся, заключалась в том, что NH не поддерживает нативную сеть Dot 4 ISet. Вы должны реализовать предоставленный набор NH (Iesi.Collections.Generic.ISet).

Произошло то, что из-за того, что я создал новую внутреннюю коллекцию из коллекции, предоставленной NH, NH подумал: «Хорошо, это не та же коллекция, поэтому этот объект грязный, поэтому обновите версию и начните каскадировать эти изменения».

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

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