NHibernate много-к-одному отображению - PullRequest
0 голосов
/ 03 апреля 2020

Классы сущностей:

public class Purchase
{
   public virtual int PurchaseId { get; set; }
   public virtual int CustomerId { get; set; }
   public virtual Customer Customer { get; set;}
}

public class Customer
{
    public virtual int CustomerId { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
}

Конфигурации спящего режима:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="xxx" assembly="xxx">
  <class name="Purchase" table="Purchase">
    <id name="PurchaseId" column="PurchaseId" />
    <many-to-one name="Customer" column="CustomerId"/>
  </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="xxx" assembly="xxx">
  <class name="Customer" table="Customer">
    <id name="CustomerId" column="CustomerId" />
    <property name="FirstName" column="FirstName" />
    <property name="LastName" column="LastName" />
  </class>
</hibernate-mapping>

Я пытаюсь сохранить новую покупку в базе данных:

 using (var session = _sessionFactory.Create())
 {
     var customer = new Customer { CustomerId = 1, FirstName = "John", LastName = "Smith" };
     var purchase = new Purchase { PurchaseId = 1, Customer = customer };

     session.Save(purchase);
     session.Flush();
 }

В таблице покупок есть FK в таблицу Customer.

И я получаю: «SqlException: невозможно вставить значение NULL в столбец« CustomerId », таблица« ORM.dbo.Purchase »; столбец не допускает пустых значений. INSERT завершается неудачей.»

Мне интересно, что я делаю не так. Большое спасибо за ответ.

1 Ответ

1 голос
/ 03 апреля 2020

Возможно, проблема в том, что NHibernate не знает, какое значение CustomerId вставить в таблицу Purchase, потому что не знает, как получить этот ключ.

Не могли бы вы попробовать и измените отображение, чтобы включить генератор

Обратите внимание, что в соответствии с NHibernate Docs

generator: имя класса генератора, используемого для генерации уникальных идентификаторов для экземпляры постоянного класса. Смотрите элемент генератора. Необходимо указать либо атрибут, либо элемент. Атрибут имеет приоритет над элементом.

Теперь, какой именно генератор выбрать, это большая топи c, которая зависит от ваших вариантов использования, см. Некоторую информацию в Как автоматически генерировать Идентификаторы в NHibernate

Если вы хотите назначить ключи в коде, вы должны выбрать генератор assigned, см. Ниже

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="xxx" assembly="xxx">
  <class name="Purchase" table="Purchase">
    <id name="PurchaseId" column="PurchaseId" generator="assigned" />
    <many-to-one name="Customer" column="CustomerId"/>
  </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="xxx" assembly="xxx">
  <class name="Customer" table="Customer">
    <id name="CustomerId" column="CustomerId" generator="assigned"/>
    <property name="FirstName" column="FirstName" />
    <property name="LastName" column="LastName" />
  </class>
</hibernate-mapping>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...