2011-01-11 75 views
1

这里是我的测试用例:NHibernate的:保存,删除然后保存同一实体抛出StaleStateException

[Test, Explicit] 
public void SaveDeleteSaveThrowsTest() 
{ 
    Produit produit = new Produit { Libelle = "Test" }; 

    using (ISession session = this.SessionProvider.OpenSession()) 
    { 
     session.FlushMode = FlushMode.Auto; 

     using (ITransaction transaction = session.BeginTransaction()) 
     {      
      session.SaveOrUpdate(produit); 
      transaction.Commit(); 
     } 

     using (ITransaction transaction = session.BeginTransaction()) 
     { 
      session.Delete(produit); 
      transaction.Commit(); 
     } 

     using (ITransaction transaction = session.BeginTransaction()) 
     { 
      session.SaveOrUpdate(produit); 
      Assert.Throws(typeof(StaleStateException), transaction.Commit); 
     } 
    } 
} 

的ID被希洛产生。

如果我在保存它之前将实体的Id赋值为0,它在这种简单的情况下工作,但在更复杂的情况下无法工作,我有一对多关系(我得到异常“collection所有者未与会话关联“时尝试删除父实体)。

有没有办法让它工作? (保存,再次删除保存同一实体)

+0

你为什么要在删除后保存? – UpTheCreek 2011-01-11 10:43:31

回答

0

尝试调用Session.Save或Session.Lock删除的produit对象。

但是,您应该重新考虑您的设计以避免此问题。我会跟踪要在一个单独的集合中删除的id,然后在提交事务时执行删除操作。

2

不要在多对多关系中使用延迟加载吗? 问题是你首先要加载实体,关闭会话并尝试使用(已分离的)实体进行操作。在这种情况下,子实体是附属于闭合会话的代理。你必须告诉NHibernate重新初始化代理:对于每个子实体调用NHibernateUtil.Initialize。

1

尝试Merge而不是SaveOrUpdate。它查找数据库中的记录(插入或更新之前的附加选择)。请注意,Merge有一个返回值,它在给定实例仍然是暂态时返回持久实例。您可能需要清理会话或创建新会话才能使其工作。

相关问题