NHibernate - получите доступ к идентификатору связанного объекта без ленивой загрузки целого объекта

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

предположим программист уже на самом деле делает это правильным способом, затем нам действительно нужно понятие внешних ключей?

Теоретически, нет. Однако никогда не было части программного обеспечения без ошибок.

Ошибки в коде приложения обычно не настолько опасны - Вы определяете ошибку и фиксируете ее, и после этого выполнение приложения гладко снова. Но если ошибка позволяет currupt данным вводить базу данных, то Вы застреваете с ним! Очень трудно восстановиться с поврежденных данных в базе данных.

Рассматривают, позволила ли тонкая ошибка в FogBugz поврежденному внешнему ключу быть записанным в базе данных. Могло бы быть легко исправить ошибку и быстро продвинуть фиксацию клиентам в выпуске bugfix. Однако, как должен поврежденные данные в десятках баз данных быть зафиксированным? Корректный код мог бы теперь внезапно повредиться, потому что предположения о целостности внешних ключей больше не содержат.

В веб-приложениях у Вас обычно только есть одна программа, говорящая с базой данных, таким образом, существует только одно место, где ошибки могут повредить данные. В корпоративном приложении могло бы быть несколько независимых приложений, говорящих с той же базой данных (не говоря уже о людях, работающих непосредственно с оболочкой базы данных). Нет никакого способа быть уверенным, что все приложения следуют за теми же предположениями без ошибок, всегда и навсегда.

, Если ограничения кодируются в базе данных, то худшее, которое может произойти с ошибками, - то, что пользователю показывают ужасное сообщение об ошибке о [приблизительно 111] ограничение SQL , не удовлетворенное. Это очень prefereable к разрешению currupt данные в Вашу базу данных предприятия, где это в свою очередь повредит все Ваши приложения или просто приведет ко всем видам неправильного или вводящего в заблуждение вывода.

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

7
задан Darko Kenda 7 August 2016 в 20:32
поделиться

1 ответ

По той же причине я использовал явные свойства AB-ID для всех моих отношений «многие к одному». Я не считаю это быстрым и грязным решением, поскольку оно обеспечивает решение этой проблемы, а также большая гибкость в области сохранения и обновления, т.е. мне не нужно извлекать из базы данных объект B, чтобы просто назначить его A в чтобы создать ассоциацию, когда у меня есть B_ID в строке запроса или где-то еще.

Мои файлы сопоставления обычно выглядят следующим образом:

<property name="CreatorID" column="CreatorID" type="Int32" not-null="true" />
<many-to-one name="Creator" column="CreatorID" class="SystemUser" insert="false" update="false" cascade="none" />

Как вы можете видеть, одно из двух свойств должно быть только для чтения, чтобы избежать NHibernate отправка этого столбца 2 раза в базу данных при выполнении вставок или обновлений. Вышеупомянутое предназначено только для чтения (с использованием insert = "false" update = "false" атрибуты) многие-к-одному, но вместо этого вы можете, если хотите, иметь свойство только для чтения CreatorID.

Имея только много-к-одному, у вас нет свойства в вашем классе сущности A для хранения B. Значение ID. Единственный способ получить его - получить доступ к объекту B, который запустит прокси-сервер и запустит запрос к базе данных (если он еще не загружен в сеансе).

Я буду рад услышать любой другой вариант который предоставляет решение и предлагает такую ​​же гибкость.

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

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

4
ответ дан 6 December 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: