2011-01-26 6 views
3

SaveOrUpdate()を呼び出して保存しているときに、この警告が表示され、Transaction.Commit()を呼び出した後にデータがデータベースに保存されません。NHibernate警告とデータが保存されない

NHibernate.Engine.ForeignKeys - [主キー]一時的または取り外し で割り当てられた識別子と、[プロジェクト名]かどうかを決定するために できません。 データベースを照会します。これを防ぐには、セッションで明示的なSave()または Update()を使用してください。

私は新しいオブジェクトを挿入しています。 Google検索は、SaveOrUpdate()の代わりにSave()を呼び出すように指示します:Save()は挿入のためのものであることを意味します。

私はGoogleで検索し、これについてはあまり見ていません。 誰も私にこの問題またはこの警告の提案をしてもらえますか?

編集:ここでは がシミュレートされたサンプルのマッピングファイルである -

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="" 
        namespace=""> 
    <class name="Customer" table="[dbo].[Customer]" optimistic-lock="none" > 
     <id name="CustomerId" column="CustomerId" > 
      <generator class="assigned"/> 
     </id> 
     <property name="Name" column="Name" /> 
     <property name="Age" column="Age" /> 
     <set name="CustomerDetails" cascade="none" inverse="true" fetch="select"> 
      <key> 
       <column name="CustomerId"/> 
      </key> 
      <one-to-many class="CustomerDetail"/> 
     </set> 
     <many-to-one name="MGender" fetch="select" cascade="none"> 
      <column name="GenderCode"/> 
     </many-to-one> 
    </class> 
</hibernate-mapping> 

<class name="CustomerDetails" table="[dbo].[CustomerDetail]" optimistic-lock="none" > 
    <id name="CustomerDetailId" column="CustomerDetailId" > 
     <generator class="assigned"/> 
    </id> 
    <property name="Detail1" column="Detail1" /> 
    <many-to-one name="Customer" fetch="select" cascade="none"> 
     <column name="CustomerId"/> 
    </many-to-one> 
</class> 

<class name="MGender" table="[dbo].[MGender]" optimistic-lock="none" > 
    <id name="GenderCode" column="GenderCode" > 
     <generator class="assigned"/> 
    </id> 
    <property name="Description" column="Description" /> 
    <set name="Customers" cascade="none" inverse="true" fetch="select"> 
     <key> 
      <column name="GenderCode"/> 
     </key> 
     <one-to-many class="Customer"/> 
    </set> 
</class> 

+0

あなたのマッピングは何ですか? – Phill

+0

オブジェクトを保存するコードを追加します。 –

答えて

6

割り当てられた識別子を使用しているため、NHibernateがエンティティを挿入または更新する必要があるかどうかを判断できるように、保存されていない属性を設定する必要があります。あるいは、新しいエンティティのためにSaveを明示的に呼び出すこともできます。

<id name="CustomerId" column="CustomerId" unsaved-value="???" > 
     <generator class="assigned"/> 
    </id> 
0

あなたはすなわち(X => x.Id).GeneratedBy.Assigned()IDを使用していないし、あなたが任意のバージョンまたはタイムスタンプ列を持っていない、何がありません、カスタムIDを使用している場合ので、予めご了承くださいNHibernateはthuisが新しい行か既存のものかどうかを知るでしょう。そこで、私はGeneratedBy.UuidString()を使って問題を解決しました。魅力のように動作します。幸いにも私の情報は保存されていました。

関連する問題