我无法掌握 NHibernates 缓存/数据库命中预防技术的一些特性。
我创建了一个测试用例,它应该确保我们的 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() 方法只是表中所有行的条件。List()。CreateTask 方法只调用 ISession.SaveOrUpdate();
我知道我有能力强制重新加载数据,但我不明白为什么我必须这样做。
当我调用 SaveOrUpdate(entity) 时,该实体应该自动添加到 NHibernate 的缓存中,对吗?为什么 TaskDao.GetAll() 会返回陈旧数据?
我担心过度使用 CommitTransaction()。我认为我不应该在每次 SaveOrUpdate() 之后调用 CommitTransaction() ——这违背了 NHibernates 缓存的目的。但是,我也不希望我的测试用例数据过时。如何保持缓存同步?