Установка отношения без извлечения объекта с помощью NHibernate - PullRequest
1 голос
/ 13 марта 2012

У меня есть два класса сущностей: Person и Position.

public class Person
{
  public virtual int Id { get; set; }
  public virtual string Name { get; set; }
  public virtual Position Position { get; set; }
}

public class Position
{
  public virtual int Id { get; set; }
  public virtual string Code { get; set; }
}

Person имеет отношение один ко многим с Position. У меня также есть DTO PersonDto, который приносит данные о клиенте от клиента.

public class PersonDto
{
  public string Name { get; set; }
  public int PositionId { get; set; }
}

После получения DTO я должен создать новый объект Person и сохранить его. Обычно это выглядит так:

var person = new Person();
CopyFromDto(person, personDto);
var position = positionRepository.GetById(personDto.PositionId);
person.Position = position;
personRepository.Save(person);

Интересно, смогу ли я избавиться от этой строки:

var position = positionRepository.GetById(personDto.PositionId);

Причина в том, что он создает ненужный запрос SQL, который выбирает некоторые данные о положении. Можно ли каким-то образом предоставить NHibernate идентификатор позиции и сохранить с ним строку человека?

Заранее спасибо.

1 Ответ

2 голосов
/ 13 марта 2012

Использование ISession.Load:

Методы Load () ISession дают вам возможность получить постоянный экземпляр, если вы уже знаете его идентификатор.

Обратите внимание, что Load () сгенерирует неисправимое исключение, если нет соответствующей строки в базе данных.Если класс сопоставлен с прокси, Load () возвращает объект, который является неинициализированным прокси и фактически не обращается к базе данных, пока вы не вызовете метод объекта.Это поведение очень полезно, если вы хотите создать ассоциацию с объектом без фактической загрузки его из базы данных.

https://nhibernate.info/doc/nh/en/index.html#manipulatingdata-loading

...