使用NHibernate進行條件查詢時,我想從緩存中獲取新的結果而不是舊的結果。重複查詢不會刷新返回對象的屬性
的方法基本上是:
- 查詢持久對象到NHibernate的應用。
- 從外部更改數據庫條目(另一個程序,SSMS/MSSQL中的手動編輯等)。
- 查詢持久化對象(使用相同的查詢代碼),以前加載的對象應從數據庫中刷新。
下面的代碼(略有改變對象名稱):
public IOrder GetOrderByOrderId(int orderId)
{
...
IList result;
var query =
session.CreateCriteria(typeof(Order))
.SetFetchMode("Products", FetchMode.Eager)
.SetFetchMode("Customer", FetchMode.Eager)
.SetFetchMode("OrderItems", FetchMode.Eager)
.Add(Restrictions.Eq("OrderId", orderId));
query.SetCacheMode(CacheMode.Ignore);
query.SetCacheable(false);
result = query.List();
...
}
的SetCacheMode和SetCacheable已經被我添加禁用緩存。此外,NHibernate的出廠設置與配置參數UseQueryCache =假:
Cfg.SetProperty(NHibernate.Cfg.Environment.UseQueryCache, "false");
不管我做什麼,包括把/刷新緩存模式,查詢或會話:NHibernate的保持返回我的過期對象第二次查詢被調用,沒有外部提交的更改。 Info btw:這種情況下的過期值是Version列的值(以測試在保存之前是否可以檢測到過時的對象狀態)。但是由於多種原因,我需要新的查詢結果!
NHibernate甚至會生成一個SQL查詢,但它永遠不會用於返回的值。保持會話打開只需要在髒列上進行動態更新(也沒有解決方案的無狀態會話!);我不想在代碼中的任何地方添加Clear(),Evict()等,特別是因爲查詢位於較低級別,並且不記得先前加載的對象。悲觀鎖定會導致性能下降(多用戶環境!)
有沒有辦法強制NHibernate通過配置直接向數據庫發送查詢並獲得最新結果,而不使用不需要的緩存功能?