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

在NHibernate中删除后从第一个缓存读取已删除对象,hibernate,nhibernate,Hibernate,Nhibernate,更新 我想知道是否已经从NHibernate的第一个缓存中删除了一个实例 private static void Evict() { using (var session = sessionFactory.OpenSession()) using (var transaction = session.BeginTransaction()) { var customers = s

更新

我想知道是否已经从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.
            }

        }
private static void execute()
{
使用(var session=sessionFactory.OpenSession())
使用(var transaction=session.BeginTransaction())
{
var customers=session.Query().ToList();
var客户=客户[0];
删除(客户);
Commit();
//如何确定客户[0]是否仍在会话中。
}
}

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

Console.WriteLine(customers[0].CustomerName);
未使用缓存-正在使用变量值。

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

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);
}
老实说:我自己并没有这样做,但就我所知,它应该能很好地工作。不要搞乱会话实现和上下文,如果写入此类,您可能会破坏一切


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

这应该用于什么?你到底想测试什么?我不明白你想实现什么。你想测试nhibernate的工作原理?真正地启动一个新事务和查询,查看session.query()的结果;