Какое значение присвоить объектным прокси при вставке или сохранении с использованием NHibernate

#c# #.net #nhibernate

#c# #.net #nhibernate

Вопрос:

Предположим, что у нас есть класс TableChild и класс TableParent. Они соответствуют аналогичным таблицам в базе данных. TableChild и TableParent имеют взаимосвязь, на что указывают их имена. Класс TableChild имеет свойство типа TableParent для репликации взаимосвязи в наших классах. Теперь, когда я вставляю новый объект для TableChild, как нам указать значение для свойства TableParent. Должны ли мы просто присвоить идентификатор TableParent тестовому дочернему элементу. Или мы извлекаем весь объект из базы данных, используя значение ID TableParent, а затем присваиваем этот объект TableChild. Второй метод возможен, но приведет к увеличению производительности, поскольку нам придется выдавать дополнительные инструкции Select .

Используемое нами сопоставление является простым, пожалуйста, предложите несколько простых методов, если это возможно, для сохранения связи с дочерней таблицей при вставке новых значений для нее же.

Ответ №1:

В C # отношения являются ссылками на объекты.

 public class TableParent
{
}

public class TableChild
{
    TableParent Parent { get; set; }
}
  

Чтобы создать дочерний объект с известным родительским объектом, присвойте ему родительский объект, который известен NHibernate. Использование ISession.Load() выдает прокси-объект, не касаясь базы данных (при условии, что отложенная загрузка не была отключена).

 // create and save a child with a known parent
var c = new TableChild {
    Parent = session.Load<TableParent>( parent_id );
};
session.Save( c );
  

Комментарии:

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

2. @tahoka: Обратите внимание, что в этом решении нет накладных расходов . Load не попадает в базу данных , предполагается, что родительский сервер отображается как ленивый, а все участники являются виртуальными.