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