在NHibernate中删除后,从第一个缓存中读取已删除的对象

时间:2012-05-09 00:56:58

标签: hibernate nhibernate

更新

我想知道是否已从NHibernate的第一个缓存中删除了一个实例

private static void Evict()
        {
            using (var session = sessionFactory.OpenSession())
            using (var transaction = session.BeginTransaction())
            {
                var customers = session.Query<Customer>().ToList();

                var customer = customers[0];
                session.Delete(customer);
                transaction.Commit();

              //how to find out whether or not customers[0] is still in session.
            }

        }

2 个答案:

答案 0 :(得分:0)

这是有道理的。当您说var customer = customers [0]时,您将客户的副本设置为变量; 您在设置变量后删除它。声明:

Console.WriteLine(customers[0].CustomerName);

没有使用缓存 - 它使用的是变量值。

答案 1 :(得分:0)

您可以尝试“黑客”会话实施:

var sessionImpl = (ISessionImplementor)session;
var sessionContext = sessionImpl.PersistenceContext;  
var entry = sessionContext.GetEntry(customer);
if (entry.Status == Status.Deleted)
{
  Console.WriteLine("Customer {0} is deleted", customer.Name);
}

说实话:我自己没有这样做,但据我所知,它应该运作良好。不要乱用会话实现和上下文,如果写入这个类,你可以破坏一切。

另一个更复杂但也更少“hacky”的方法是注册删除处理程序。问题是a)它是在数据库中删除实体时执行的(例如:刷新会话时)和b)它需要在会话工厂的配置时注册,这会使实现变得困难。