2016-04-29 5 views
2

Я создаю приложение MultiLingual с некоторыми динамическими переводами в нем. Поэтому я решил сделать отдельные таблицы для продуктов, включая переводы.NHibernate не вставляя детей

Нет У меня возникли проблемы с вставкой переводов, они являются частью продукта. Который вставлен.

<class name="Product" table="Product"> 
    <id name="Id"> 
     <generator class="native" /> 
    </id> 
    <property name="SomeOtherStuff" column="SomeOtherStuff" /> 
    <set name="NaamTranslations" cascade="all"> 
     <key column="ProductId" not-null="true" /> 
     <one-to-many class="ProductTranslation" /> 
    </set> 
    </class> 

    <class name="ProductTranslation" 
     table="ProductTranslation" lazy="false"> 
    <id name="Id"> 
     <generator class="native" /> 
    </id> 
    <many-to-one name="Product" column="ProductId" not-null="true" 
       index="UQ_ProductTranslation" class="Product" 
       cascade="all-delete-orphan" /> 
    <property name="CultureCode" column="LanguageCode" 
       not-null="true" index="UQ_ProductTranslation" /> 
    <property name="Name" column="Name" not-null="true" /> 
    </class> 

Я предполагаю, что проблема заключается в конфигурации NHibernate. Поскольку я могу следить за созданием продукта во всем коде. Также я включил show_sql, и он показывает создание Продукта, но в нем отсутствуют вставки ProductTranslations.

INSERT INTO dbo.Product (SomeOtherStuff) VALUES (@p0); 
select SCOPE_IDENTITY(); @p) = 'Hello this is a test' [Type: String (4000)] 

ответ

0

Вышеуказанное картографирование должно работать. Он будет генерировать не всегда нужные SQL-запросы.

  1. Вставить в головной продукт
  2. Вставить в детской таблице ProductTranslation, без ссылки на таблицу Product (The ProductId столбец должен быть обнуляемым)
  3. ОБНОВЛЕНИЕ ребенок стол с ProductId ссылкой

Таким образом, это несколько сложный SQL-запрос будет работать даже для такого рода присвоений C#

var p = new Product(); 
var tr1 = new ProductTranslation(); 
var tr2 = new ProductTranslation(); 
p.NaamTranslations.Add(tr1); 
p.NaamTranslations.Add(tr2); 

session.Save(p); 

Чтобы избежать этих вставок и обновлений и иметь только один INSERT, мы можем использовать inverse. Это было бы так же, как этого

<class name="Product" table="Product"> 
    ... 
    <set name="NaamTranslations" cascade="all" inverse="true"> 

, но теперь мы должны установить обе части ссылки в C#

var p = new Product(); 
var tr1 = new ProductTranslation(); 
var tr2 = new ProductTranslation(); 
p.NaamTranslations.Add(tr1); 
p.NaamTranslations.Add(tr2); 

// too soon - relation back to product is missing 
//session.Save(p); 

// assign reference 
tr1.Product = p; 
tr2.Product = p; 
// now cascade will work 
session.Save(p); 

NHibernate теперь будет:

  1. Вставьте в родителю
  2. Вставить полная запись в ребенка (без дополнительных обновлений)
Смежные вопросы