Я уверен, что это простой вопрос, но учтите следующее:
У меня есть ссылка между компанией и сектором следующим образом:
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; }
}
Ok. То, что я хочу, это 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 для этой коллекции SqlParameterCollect со счетчиком = 7.
Возможно, мне придется сделать первый вариант, но я обеспокоен тем, что дополнительный запрос будет запущен, когда вы вызываете SectorID get, поскольку он выводит сам Сектор из БД (если только он не загружен, что немного хлопот).
Я удивлен, что нет простого ответа на этот вопрос.
WOW!
Если я использую
public virtual Guid SectorID
{
get { return Sector.ID;
}
тогда nhibernate достаточно умен, чтобы знать, что столбец Sector_id в запросе Organization на самом деле совпадает с Sector.ID, и он возвращает это изнутри. Это не отправляет дополнительный запрос, даже если вы ленивая загрузка. Я впечатлен!
Как продолжение ... Кажется, что hibernate на самом деле не написан, чтобы можно было сопоставить столбец внешнего ключа в объектах. Хотя это может быть немного болезненно в веб-интерфейсах, это имеет смысл, поскольку это действительно постоянная проблема, а не проблема объекта.
Я использую asp.net MVC и написал пользовательский механизм связывания моделей, который будет принимать поле ввода имени Contact (а не ContactID), создаю новый Contact с идентификатором того, что находится в texbox, и затем применяю это к свойство модели. Это позволяет обойти проблему с выпадающими списками в веб-интерфейсах. Разместим код, если кому-то интересно.