Несколько упрощенный пример ситуации: у меня есть сущности A и B, которые являются невероятно «тяжелыми» объектами предметной области. Загрузка одного из базы данных - довольно сложная задача. Затем у меня есть объект C, который представляет собой очень простой объект со строкой метки, одним A и одним B - оба ленивые.
Я выполняю некоторые низкоуровневые запросы для создания огромных списков C, поэтому я точно знаю, какие идентификаторы мне нужно сохранить для CA и CB, но я не хочу загружать целые объекты и устанавливать их свойства, потому что накладные расходы безумие.
Вместо этого я хочу просто вставить идентификаторы непосредственно в свои объекты C, а затем позволить свойствам A и B полностью загружаться позже, только если это необходимо.
Я вижу тег <sql-insert/> в документации, но раздел В самом деле разрежен.
Есть ли способ делать то, что я хочу делать внутри фреймворка NHibernate, или я должен просто выполнять необработанный SQL? Я пытаюсь сохранить переносимость базы данных, если это возможно, что заставляет меня уклоняться от необработанного варианта. Похоже, мне не хватает лучшего способа.





Я не знаю, позволяет ли это NHibernate (отдельные объекты на одних и тех же базовых данных), но обычно я делаю объекты «переваривания», которые могут быть преобразованы с повышением частоты в полноценные объекты (даже при ленивой загрузке полнофункциональных объектов). Я обычно делаю это с помощью генерируемого кода или вручную слоев ORM.
Большие коллекции обычно представляют собой дайджесты, а затем, если необходимые свойства или методы не отображаются в дайджесте, они преобразуются в полные объекты для вызова или для передачи и т. д.
Что ж, это не обязательно будет работать с NHibernate, это будет просто два класса, один из которых является дайджестом другого только для чтения, основанным на тех же базовых таблицах.
Ага, теперь я тебя понимаю. Я не уверен, по какому пути идти, но спасибо за подсказки ... все это немного сложно!
Дэн - не уверен, что это сработает без тестирования, но попробовать стоит. Я предполагаю, что у вас уже есть идентификаторы, которые вы хотите добавить в свой C - поэтому установите свои ассоциации (я предполагаю, что многие-к-одному) insert = "false" и update = "false" (возможно, cascade = "none "также будет работать в качестве альтернативы). Затем создайте «пустую копию» ваших сущностей A и B, добавьте к ним идентификаторы, добавьте их в C и попытайтесь сохранить C (Session.SaveOrUpdateCopy (C)). Надеюсь, NHibernate не будет пытаться добавить новые объекты A и B в соответствующую таблицу, а просто установит правильные идентификаторы в таблице C - таким образом вам не нужно загружать объекты A и B.
Плохо то, что если вам нужно сохранить или обновить A и B, вам придется делать это напрямую. Другая плохая часть заключается в том, что у меня нет времени тестировать это, поэтому я не знаю, сработает ли это.
Ага, я понимаю, о чем вы говорите. Я не уверен, что подумает NHibernate, если я попытаюсь сделать некаскадное сохранение с A и B в качестве «фиктивных объектов», но я попробую.
Я добавил "ручной" слой, но я хочу знать, можно ли это сделать, не работая с NHibernate ... так что это определенно было полезно, но это не похоже на "правильный" путь.