2012-02-27 2 views
0

Я не могу четко сформулировать, что хочу в названии, очень хорошо, но по существу это возможно?NHibernate половина отображения одного направления?

public class Employee { 
    public Address address; 
... 

public class address { 
... 

Очень простая объектная модель, сотрудник, обладающий свойством объекта Address. В NHibernate, когда это отображается будет производить что-то вроде:

table Employee 
    EmployeeId 
    AddressId 
... 

table Address 
    AddressId 
... 

Так что это все хорошо до сих пор, моя таблица Employee имеет столбец внешнего ключа в адресной таблице, идеально. Я хочу, однако, когда я получаю с NHibernate, что он не присоединяется к этой таблице и не заполняет объект Address, а вместо этого создает экземпляр объекта Address и заполняет свойство AddressId.

Теперь, прежде чем я получаю множество ответов о загрузке Нисходящих ядер, я уже знаю. Это скорее «возможно», а не «это хорошая идея», потому что я уверен, что это, вероятно, нет. Мне просто нравится видеть, насколько гибким является NHibernate.

ответ

4

Один из способов заключается в том, чтобы разоблачить AddressId как полностью отображаемый элемент в классе Employee. Таким образом, вы можете получить AddressID от: -

Employee.AddressId 

Однако сказал, ничего не загружается или дополнительный выберите посылаются в базу данных, если вы просто получить идентификатор из: -

var addressId = Employee.Address.Id 
+0

Это похоже на единственное решение да, я просто хотел бы, чтобы был способ остановить NHibernate от вытаскивания всего объекта, кроме как через ленивую загрузку. – David

+2

Это не вызывает выражение select в базе данных 'var addressId = Employee.Address.Id' – Rippo

1

Это не имеет для меня такого смысла, поскольку у вас уже есть AddressId как ссылка на адрес, поэтому создание объекта просто для того, чтобы дать вам это, кажется ненужным. НО, возможно, вы хотите что-то вроде этого: http://ayende.com/blog/4378/nhibernate-new-feature-no-proxy-associations

Редактировать, после комментариев: также такие вещи, как адрес, могут быть отображены как компоненты, возможно, это поможет с вашими требованиями. см. эту ссылку и google для начала: http://ayende.com/blog/3937/nhibernate-mapping-component

+0

Я полагаю, я не слишком заинтересованы в NHibernates «загружать все» или «ленивую нагрузку, но вы должны сделать это в рамках сессии». Я хочу возможность создать нового сотрудника, а затем адрес для этого сотрудника и для NHibernate, чтобы сохранить его в db, но я не хочу автоматически извлекать объект Address или ленивую загрузку на лету. – David

0

Возможно, я не понимаю вопрос, но то, о чем вы просите, - это то, как по умолчанию загружается по умолчанию NHibernate. Если вы получите экземпляр Employee, адрес будет прокси-адресом Address с набором AddressId. Доступ к любому свойству помимо AddressId приведет к тому, что NHibernate получит запись адреса.

+0

Нет, я знаю, как работают обезболивающие работы NHibernates. Мне любопытно, можно ли достичь этой половины меры. Я не хочу ленить загружать адресный объект и не хочу его извлекать по умолчанию. Все, что я хочу, это AddressId, но отображается на соответствующий объект. – David

+1

Как это отличается от ленивой загрузки? Я отвечу на второй ответ о том, что то, о чем вы просите, не имеет смысла. –

+0

Это по-другому, потому что NHibernate требует, чтобы вы объявили все свои свойства виртуальными, а затем создали прокси-сервер, который уходит, и пытается получить данные при доступе, который вызывает ошибку, если сеанс закрыт. Все, что я хочу - это идентификатор, но поддерживающий объектную модель. – David

Смежные вопросы