Однонаправленная ассоциация родитель-ребенок не нуль - PullRequest
1 голос
/ 29 октября 2011

У меня есть структура класса, которая схожа с шаблоном PurchaseOrder (родительский) и PurchaseOrderLine (дочерний), где строки заказа будут сохранены только в БД путем сохранения родительского PurchaseOrder и будут доступны только через родительский объект..

В БД установлен параметр PurchaseOrderLine.PurchaseOrder, запрещающий использование нулевых значений.

При поиске в Интернете кажется, что невозможно получить однонаправленную ассоциацию из PurchaseOrder через IList.свойство без необходимости иметь свойство в строке, указывающей назад, когда у дочернего элемента есть ограничение NOT NULL для его столбца PurchaseOrder.

Действительно ли это так?Кажется, что это одна из самых основных вещей, которые можно сделать с ORM, и мне трудно согласиться с тем, что такой зрелый продукт, как NHibernate, не может справиться с таким базовым сценарием.

Ответы [ 3 ]

0 голосов
/ 29 октября 2011

Что ж, возможно, вы не можете иметь однонаправленное отношение один-ко-многим , определенное только на стороне одна , но я поспорю с вашим утверждением, чтоэто «одна из самых основных вещей, которые можно сделать с ORM».

Одной из самых простых вещей было бы определение однонаправленного один-ко-многим , определенного только на стороне много - так как это естественно для таблиц RDBM.И ORM (несмотря на распространенное заблуждение) не предназначены (или не способны) полностью абстрагировать модель предметной области от базового источника данных .Даже если в некоторых случаях они могут, сторона базы данных страдает от выбранных проблем N + 1 или очень неэффективных запросов.

Определение один-ко-многим на одна сторонаСоздается впечатление, что считая коллекцию дешево.Это справедливо для простых графов объектов, но не для сущностей NHibernate, поскольку чтение коллекции вызывает (как минимум один) вызов базы данных.Стремительное извлечение со стороны one также не может должным образом использовать механизм соединения с базой данных так, как он предназначен (в отличие от нетерпеливого извлечения со стороны many ).

Даже если я не согласен с большим количеством аргументов, я думаю, что будет полезно прочитать некоторые статьи, в которых говорится, что «ORM - это анти-шаблон», например, , этот .Они помогли мне использовать то, что я думаю об ORM, и заставили меня думать о ORM как о компромиссе между двумя несоответствующими парадигмами , но не как о способе скрыть одну за другой.

0 голосов
/ 14 августа 2012

Теперь это можно сделать в NH3, используя Not.KeyNullable ()

        this.HasMany(x => x.Actions)
            .Access.BackingField()
            .KeyColumn("[Application]")
            .Not.KeyNullable()
            .Cascade.AllDeleteOrphan();
0 голосов
/ 29 октября 2011

Нет, это не тот случай. См. Пример, приведенный в ответе на этот вопрос: Когда использовать обратное = false для отношений NHibernate / Hibernate OneToMany?

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