Двунаправленный NHibernate 3.0 beta1 не может добавить дочерний объект - PullRequest
0 голосов
/ 13 октября 2010

Короче говоря, проблема в том, что при добавлении дочернего объекта в свойство коллекции родительского объекта без явной установки родительского свойства дочернего объекта вставка завершится неудачно. Давайте рассмотрим пример:

ПРИМЕЧАНИЕ : я использую NHibernate 3.0 beta1.

Пример: Категория продукта Senario:

(1) Схема базы данных:

  1. Категория (Id, Имя)
  2. Продукт (Id, Name, Price, CategoryId)

(2) Код C # для доменных моделей

public class Category
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Product> Products { get; private set; }
}    

public class Product
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual decimal Price { get; set; }
    public virtual Category Category { get; set; }
}

(3) Отображения

<class name="Category" table="Category">
  <id name="Id" column="Id">
    <generator class="identity" />
  </id>
  <property name="Name" />
  <bag name="Products" inverse="true" cascade="all">
    <key column="CategoryId" />
    <one-to-many class="Core.Product"/>
  </bag>
</class>

<class name="Product" table="Product">
  <id name="Id" column="Id">
    <generator class="identity" />
  </id>

  <property name="Name" />
  <property name="Price" />
  <many-to-one name="Category" column="CategoryId" />
</class>

(4) Телефонный код

using (var session = sessionFactory.OpenSession())
{
    Category category = session.Query<Category>().FirstOrDefault();
    Product product = new Product
    {
        Name = "test",
        Price = 50
    };
    category.Products.Add(product);
    // Here, the p.Category is null, but it should NOT be null
    // And if now I commit the changes the the database,
    // And exception will be thrown: Cann't insert null to column CategoryId
}

Когда выполняется category.Products.Add(product), product.Category будет объектом category! Если я явно установлю product.Category в категорию, операция фиксации будет выполнена успешно. Почему это? Ошибка NHibernate 3.0 beta1 или других?

1 Ответ

1 голос
/ 13 октября 2010

Это ведет себя точно так, как задокументировано.

6,4. Ассоциации один-ко-многим

NHibernate НЕ установит product.Category для вас. Обычный способ избежать этого - добавить метод AddProduct в категорию, который добавляет продукт в коллекцию Products и устанавливает свойство Category.

...