2016-04-29 11 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をオンにして、Productの作成を示していますが、ProductTranslationsの挿入が欠けています。

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

答えて

0

上記のマッピングが有効である必要があります。これは、必ずしも必要なSQL文を生成するものではありません。

  1. ProductId列がNULL可能でなければなりません)Productテーブルを参照することなく、子テーブルProductTranslationProductId参照

と子テーブルを

  • UPDATEを挿入し、親製品
  • に挿入しますしたがって、この複雑な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が1つしかない場合は、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. インサートを挿入します子供のフルレコード(後で更新なし)
  • 関連する問題