Конформистское отображение коллекций nHibernate - PullRequest
0 голосов
/ 16 мая 2019

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

не удалось инициализировать коллекцию: [mas.workflow.dto.SearchCustomer.InboundTrackingNumbers # 65117]

Где он делает эту глупую вещь .elt во внутреннем исключении:

Неверное имя столбца 'elt'. Неверное имя столбца 'elt'. (да, дважды)

Вот как я ожидаю, что данные будут ...

У меня есть объект SearchCustomer, который привязан к представлению в SQL и отображается так (ненужные поля удалены)

    public SearchCustomerMap()
    {
        Table("Search_Customers");
        Id(p => p.Id, m =>
        {
            m.Column("AddressId");
            m.Generator(Generators.Assigned);
        });
        Property(p => p.CustomerId,m=>m.Unique(false));

        Set(p => p.InboundTrackingNumbers, m =>
        {
            m.Table("OrderInboundTrackingNumber");
            m.Lazy(CollectionLazy.NoLazy);
            m.Fetch(CollectionFetchMode.Join);
            //m.Cascade(Cascade.All);
            //m.Inverse(true);
            m.OrderBy(itn => itn.OrderDate);
            m.Key(k =>
            {
                k.Column("CustomerId");
                k.PropertyRef(p => p.CustomerId);
            });

        } , a => a.ManyToMany(o =>
        {
            o.NotFound(NotFoundMode.Ignore);
        }));

InboundTrackingNumbers - это IEnumerable, а OrderInboundTrackingNumber отображается следующим образом:

    public OrderInboundTrackingNumberMap()
    {
        Table("OrderInboundTrackingNumber");
        Id(p => p.Id, m =>
        {
            m.Column("Id");
            m.Generator(Generators.Identity);
        });
        Property(p => p.CustomerId);
        Property(p => p.OrderId);
        Property(p => p.OrderDate);
        Property(p => p.InboundTrackingNumber);
    }

Поиск (в моем приложении) работает нормально, если на самом деле у него нет входящих номеров отслеживания ИЛИ это единственный SearchCustomer.

Но в случае ошибки я получаю несколько обращений searchCustomer с одним и тем же CustomerId (допустимый сценарий, каждый из которых привязан к своему адресу). Таким образом, в SearchCustomer AddressId является «ключом», а CustomerId может повторяться. Таким образом, каждый удар (в данном случае 3) должен ссылаться на один и тот же набор InboundTrackingNumbers, поскольку они объединяются как SearchCustomer.CustomerId = OrderInboundTrackingNumber.CustomerId

Я попробовал OneToMany вместо ManyToMany безрезультатно. На самом деле, я получаю более странное InnerException

Неверное имя объекта 'InboundTrackingNumbers'.

Если создаваемый SQL пытается запросить имя поля «FROM InboundTrackingNumbers» вместо указанной базовой таблицы «OrderInboundTrackingNumber»

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

HELP !!! :)

...