NHibernate: столбец не допускает нулевые значения. Вставить не удается - PullRequest
4 голосов
/ 26 февраля 2009

У меня 2 лица Персона и Адрес, Персона имеет один адрес.

РЕДАКТИРОВАТЬ: Адрес уже существует, я просто хочу сохранить внешний ключ.

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

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

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

Невозможно вставить значение NULL в столбец «Ключ», таблица «Адрес»; колонка не допускает нулевые значения. Вставить не удается. заявление было прекращено.

Отображение фрагмента файла из Person

<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>

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

Ответы [ 3 ]

2 голосов
/ 26 февраля 2009

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

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 голосов
/ 26 февраля 2009

Исправлено!

Я изменил свое свободное отображение nhibernate, я использовал отношение ссылок вместо HasOne.

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

<many-to-one name="Address" column="AddressKey" />
0 голосов
/ 26 февраля 2009

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

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

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