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

相关问题