Как сохранить экземпляры анонимных типов через NHibernate? - PullRequest
3 голосов
/ 12 февраля 2010

Инстинктивно, я бы сказал, что это невозможно, так как NHibernate должен знать некоторую картографическую информацию о том, как сохранить данный тип. Таким образом, я столкнулся с некоторыми ситуациями, в которых я мог использовать такую ​​функцию. Например, через именованный запрос или что-то в этом роде. С другой стороны, использование именованного запроса потребует от меня добавления файла конфигурации.

Предположим, у нас есть приложение, взаимодействующее с каким-либо базовым хранилищем данных. Это хранилище данных настраивается с помощью файла конфигурации NHibernate. Затем я хочу, чтобы NHibernate загружал только подмножество свойств сущности из другой подсистемы, с которой моему приложению не должно было бы сильно взаимодействовать, поэтому не стоит определять классы для этой системы, так как мне нужна только доля информация об этой инопланетной системе, скажем, три из тридцати двух столбцов данных. В этом отношении, если бы я решил загрузить только эти три столбца, скажем, из-за проблем с производительностью, я бы тогда использовал анонимный тип, выполнил необходимые действия с этой информацией, а затем сохранил ее обратно в хранилище данных. Теперь, было бы не очень интересно делать это, если бы у меня была только одна сущность для загрузки из хранилища данных, поэтому предположим, что у меня есть около 75 000 строк для загрузки в мой процесс. Затем я очень серьезно подумаю над этим вариантом подмножества!

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

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

Заранее спасибо за любые комментарии и ответы.

1 Ответ

1 голос
/ 12 февраля 2010

Есть два подхода к этому.

Во-первых, если вам нужно выбрать объекты и не намерены сохранять их обратно в БД, вы можете использовать конструкцию select new HQL . Таким образом, вы сможете указать, какие свойства загружать из БД.

Второй подход немного сложнее и лучше проиллюстрирован на следующем примере.

Предположим, у вас есть таблица Images, которая, естественно, содержит изображения. Имеет Length, ContentType, CreatedOn, Content, Description и другие столбцы.

В некоторых частях вашего приложения вы можете просто редактировать метаданные изображения, фактически не отображая само изображение. Поэтому по соображениям производительности вам необходимо загрузить только часть метаданных . Однако в конечном итоге вы сохраните это в БД, поэтому подход select new не будет работать. Что будет работать, это:

class ImageMetadata
{
    public string ContentType { get; set; }
    public string Description { get; set; }

    // Etc
}

class Image : ImageMetadata
{
    // To native English speakers out there: is it "Content" or "Contents"?
    public byte[] Content { get; set; }
}

Здесь вам необходимо отобразить оба класса в одну и ту же таблицу БД и просто загрузить либо ImageMetadata, либо целое Image в зависимости от ситуации.

Конечно, это не очень хорошо масштабируется, но может спасти вас от множества проблем с производительностью.

Что касается 75 000 объектов: ORM не предназначены для массовых обновлений.

...