2009-02-26 7 views
4

У меня есть 2 сущности Лицо и адрес, у человека есть один адрес.NHibernate: Столбец не допускает нулей. INSERT не работает

EDIT: Адрес уже существует, я просто хочу сохранить внешний ключ.

Когда я делаю это:

PersonDTO person = new PersonDTO(); 
    person.Age = "Bob"; 
    person.Address = new AddressDTO {Key = 123}; 
    Save(person); 

Я получаю это исключение:

Не удается вставить значение NULL в столбце 'Key', таблицы 'Адрес'; столбец не разрешает ошибки. INSERT не работает. Заявление было прекращено.

фрагмент файла Mapping от лица

<class name="PersonDTO" table="Person" xmlns="urn:nhibernate-mapping-2.2"> 
    <id name="Key" column="PersonKey" type="Guid"> 
     <generator class="guid" /> 
    </id> 
    <one-to-one name="Address" class="AddressDTOl" /> 
    </class> 

Я не понимаю, почему это происходит, им дает Адресный ключ значение. Является ли мой подход ошибочным?

+0

Включить NHibernate отображения и объявления классов. –

ответ

0

Исправлено!

Я изменил свое сопоставление nhibernate fluent, я использовал ссылку Ссылки вместо HasOne.

Это привело к изменению отображения этого:

<many-to-one name="Address" column="AddressKey" /> 
0

Сохраните адрес перед сохранением человека. В зависимости от генератора вам может потребоваться сохранить перегрузку, которая проходит в идентификаторе.

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

+0

Жаль, что я не был чистым, адрес уже существует, я просто хочу сохранить ссылку Лица на адрес. – Dan

+0

Получил ли адрес тот же сеанс, который вы используете для сохранения? Если нет, вам нужно присоединить адрес к сеансу сохранения. –

+0

? Я не получаю адрес, в приведенном выше примере я создаю новый адрес с ключом know. Я также переключил его так, чтобы он получал полный адресный объект из того же сеанса, но я получаю ту же ошибку. – Dan

2

Вы должны сделать это

AddressDTO add = new AddressDTO {Key = 123}; 
Save(add); 

PersonDTO person = new PersonDTO(); 
person.Age = "Bob"; 
person.Address = add; 
Save(person); 

Или измените отображение, если вы не хотите, чтобы явно сохранить Адрес:

<many-to-one name="Address" column="..." class="AddressDTO" cascade="save-update" /> 

Если адрес уже существует, то вам нужно получить его от база данных:

PersonDTO person = new PersonDTO(); 
person.Age = "Bob"; 
person.Address = GetAddressDTO(123); 
Save(person); 
+0

Жаль, что я не был чистым, адрес уже существует, я просто хочу сохранить ссылку Лица на адрес – Dan