1

我有一個由NHibernate實現並使用Lazy Loading的項目。 我在這個項目中有兩個班級:人員和家庭。 這兩者之間的關係是聚合,是指一個人有一個家庭列表。 映射是:Cascade中的錯誤:具有相同標識符值的不同對象已與會話相關聯

<class name="Person" table="Person_Person" > 

    <id name="Id" type="Int64" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 

    <bag name="Families" inverse="true" table="Person_Family" cascade="all-delete-orphan" > 
     <key column="Person_id_fk"/> 
     <one-to-many class="Domain.Entities.Family,Domain.Entities"/> 
    </bag> 

    </class> 

在這個項目中,我得到一個人的ID,然後更新一個家庭的家庭的人。

Person person = SessionInstance.Get<Person>(id); 
foreach (Family fam in person.Families) 
    if (fam.Name == "Jaun") 
     { 
     fam.Code = 100; 
     SessionInstance.Update(fam); 
     } 

家庭沒有更新,因爲此消息拋出異常: '不同的對象使用相同的標識符值已經與會話相關聯:193,實體:Domain.Entities.Family

我如何更新一個人的家庭?

回答

0

在你的情況下,你不需要撥打Update。你只需要刷新會話。在你的情況,我會做這樣的事情:

using (ITransaction transaction = SessionInstance.BeginTransaction()) 
{ 
    foreach (Family fam in person.Families) 
    { 
     if (fam.Name == "Jaun") 
     { 
      fam.Code = 100; 
     } 
    } 

    transaction.Commit(); 
} 

或者你也可以做這樣的事情:

foreach (Family fam in person.Families) 
{ 
    if (fam.Name == "Jaun") 
    { 
     fam.Code = 100; 
    } 
} 

SessionInstance.Flush(); 

ISession.Update()是指用於更新detached對象。在你的情況下,對象不會分離。你應該閱讀在NHibernate的documenation以下兩個部分有更好的理解這一點:

http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-updating-insession
http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-updating-detached

0

嘗試更新人員對象而不是家庭對象。

Person person = SessionInstance.Get<Person>(id); 
foreach (Family fam in person.Families) 
    if (fam.Name == "Jaun") 
     { 
     fam.Code = 100; 
     } 
SessionInstance.Update(person); 
+0

我測試你的建議,但沒有解決我的問題。 仍然拋出相同的異常。 – Ehsan

+0

我想那麼你需要確保同一個人對象,即具有相同的ID,不應該在會話中的其他地方加載。 @ehsanzeynali – Zohaib

+0

我不確定這是什麼意思?自然人在會議上加載因爲我需要人的家人。由這段代碼'Person person = SessionInstance.Get (id); '。 – Ehsan

相關問題