2012-09-14 77 views
0

我無法掌握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緩存的目的。但是,我也不希望我的測試用例有過時的數據。我如何讓我的緩存保持同步?

回答

2

你是在正確的,你不應該提交您的交易後,每次保存,但您的Web服務應在網絡呼叫開始要創建一個新的事務,並在網絡通話結束時提交。

Web服務通常遵循每個請求的模式相同的會話網站通常遵循這樣保證你的Web服務的基礎設施既創造了新的NHibernate的ISession並開始與每個請求一個新的事務。在該請求結束時,它應該提交所做的任何更改。

+0

謝謝。這基本上是我的想法,但我想讓其他人爲我確認這個想法。 :) –