2011-01-26 76 views
3

當我通過調用SaveOrUpdate()保存時,我得到了這個警告,並且在調用Transaction.Commit()之後數據沒有保存在數據庫中。NHibernate警告和數據不會保存

NHibernate.Engine.ForeignKeys - 無法 ,以確定是否[項目名稱]與 分配的標識符[PrimaryKey的]是 瞬態或分離;查詢 數據庫。在會話中使用顯式的Save()或 Update()來防止這種情況發生。

我插入一個新的對象。谷歌搜索告訴我調用Save()而不是SaveOrUpdate():意味着Save()僅用於插入。

我在谷歌搜索,沒有看到這個。 任何人都可以給我這個問題或此警告的建議嗎?

編輯: 這裏是模擬的樣本映射文件 -

<?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 2011-01-26 06:35:38

回答

6

您正在使用分配的標識符,因此您需要設置unsaved-value屬性,以便NHibernate可以確定是否應插入或更新實體。或者你可以顯式調用Save來獲得新的實體。

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

請注意,如果您使用的是自定義的ID,即不使用ID(X => x.Id).GeneratedBy.Assigned()和你沒有任何版本或時間戳列,沒有方式NHibernate會知道,如果這是一個新的行或現有的。所以,我通過使用GeneratedBy.UuidString()來解決了我的問題。奇蹟般有效。幾乎把我的代碼投入到生產中,並帶着這個錯誤信息,幸運的是我的信息正在保存。