Я уверен, что это простой вопрос, но учтите следующее: у меня есть ссылка между компанией и сектором следующим образом:
public class Company {
public Guid ID { get; set; }
public Sector Sector { get; set; }
public Guid SectorID { get; set; }
}
public class Sector {
public Guid ID { get; set; }
public string Name { get; set; }
}
В порядке. Я хочу, чтобы SectorID объекта Company был заполнен после того, как я перейду:
(new Company()).Sector = new Sector() { Name="asdf" }
и сделайте промывку.
Используемое мною отображение создает дополнительный столбец в базе данных с именем Sector_Id в таблице Company, но он недоступен в качестве свойства в Company. Я хочу, чтобы свойство SectorID было заполнено.
Отображение, которое я сейчас использую в CompanyMap:
References(c => c.Sector).Cascade.All();
У кого-нибудь есть идеи?
Спасибо за ваш ответ. К сожалению, если я выберу второй вариант (установите имя столбца столбца таким же, как свойство, или установите Map(x => x.SectorID, "Sector_Id")
, я получу сообщение об ошибке:
System.IndexOutOfRangeException: недопустимый индекс 7 для этой коллекции SqlParameterCollection с Count = 7.
Возможно, мне придется сделать первый вариант, но я обеспокоен тем, что при вызове SectorID get будет запущен дополнительный запрос, поскольку он извлекает сам сектор из базы данных (если только он не загружен с нетерпением, что немного затруднительно).
Я удивлен, что на этот вопрос нет простого ответа.
ВАУ! Если я использую
public virtual Guid SectorID
{
get { return Sector.ID;
}
тогда nhibernate достаточно умен, чтобы знать, что столбец Sector_id в запросе Organization на самом деле то же самое, что и Sector.ID, и он возвращает его под капотами. Он не отправляет дополнительный запрос, даже если вы выполняете ленивую загрузку. Я впечатлен!
В качестве продолжения ... Похоже, что спящий режим на самом деле не написан, чтобы иметь возможность отображать столбец внешнего ключа в объектах. Хотя это может быть немного неудобно для веб-интерфейсов, это имеет смысл, поскольку на самом деле это проблема постоянства, а не проблема объекта. Я использую asp.net MVC и написал настраиваемый связыватель модели, который будет принимать поле ввода имени контакта (а не ContactID), создать новый контакт с идентификатором того, что находится в тексбоксе, а затем применить его к свойство Модели. Это позволяет обойти проблему с раскрывающимися списками в веб-интерфейсах. Выложу код, если кому интересно.