更新
我想知道是否已从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.
}
}
答案 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)它需要在会话工厂的配置时注册,这会使实现变得困难。