我無法掌握NHibernates緩存/數據庫命中預防技術的一些功能。通過Web服務接收來自NHibernate的陳舊數據
我創建這是爲了確保我們的Web服務API正確創建並保存了一個新的對象測試用例。當我不必通過Web服務序列化時(例如,直接使用Web服務類而不是將其添加爲服務引用並通過它向上/向下),測試用例就可以正常工作。但是,當我對託管的Web服務運行測試用例時,我從NHibernate收到陳舊的數據。
[Test]
public void CreateInstallTask()
{
int numberOfTasks = TaskDao.GetAll().Count();
TaskDto taskDto = WorkflowServices.CreateInstallTask(OrderID, TaskTemplateID, SiteID, DataCenterID,
DeviceTemplateID, DeviceName, Username);
if (TaskDao.GetAll().Count() == numberOfTasks)
{
string failureReason =
string.Format("Failed to create new Install task with OrderID: {0}", taskDto.OrderID);
throw new Exception(failureReason);
}
}
[WebMethod(Description = "Creates a new install Task.")]
public TaskDto CreateInstallTask(int orderID, int taskTemplateID, int siteID, int dataCenterID,
int deviceTemplateID, string deviceName, string username)
{
try
{
Order order = OrderDao.GetByID(orderID, shouldLock: false);
if (order == null)
throw new Exception(string.Format("Failed to find an order with ID {0}", orderID));
Task task = new Task
{
Order = order,
TaskType = TaskType.Install,
TaskTemplateID = taskTemplateID,
CreateUserID = username,
CreateDateTime = DateTime.Now
};
TaskAction taskAction = new TaskAction(TaskDao, TaskDeviceDao, ActivityDao, task, username);
//Call TaskDto.Create to convert Task into TaskDto for client-side use.
return TaskDto.Create(taskAction.CreateTask());
}
catch (Exception exception)
{
Logger.Error(exception);
throw;
}
}
GetAll()方法只是表中所有行的criteria.List()方法。 CreateTask方法只是調用ISession.SaveOrUpdate();
我明白,我必須強迫重新加載數據的能力,但我不明白爲什麼我應該這樣做。
當我打電話SaveOrUpdate(實體),該實體應自動被添加到NHibernate的緩存,對不對?爲什麼TaskDao.GetAll()返回陳舊的數據?
我擔心過度使用CommitTransaction()。我認爲我不應該在每個SaveOrUpdate()之後調用CommitTransaction() - 這會破壞NHibernates緩存的目的。但是,我也不希望我的測試用例有過時的數據。我如何讓我的緩存保持同步?
謝謝。這基本上是我的想法,但我想讓其他人爲我確認這個想法。 :) –