我无法掌握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()方法只是表格中所有行的criteria.List()。 CreateTask方法只调用ISession.SaveOrUpdate();
我知道我有能力强制重新加载数据,但我不明白我为什么要这样做。
当我调用SaveOrUpdate(实体)时,该实体应该自动添加到NHibernate的缓存中,对吧?为什么TaskDao.GetAll()会返回陈旧数据?
我担心过度使用CommitTransaction()。我不认为我应该在每个SaveOrUpdate()之后调用CommitTransaction() - 这会破坏NHibernates缓存的目的。但是,我也不希望我的测试用例有过时的数据。如何让我的缓存保持同步?
答案 0 :(得分:2)
你是正确的,因为你不应该在每次保存后提交你的交易,但你的网络服务应该是在网络电话开始时创建一个新交易并在网络电话结束时提交。
Web服务通常遵循网站通常遵循的每个请求模式的相同会话,因此请确保您的Web服务基础结构正在创建新的NHibernate ISession并为每个请求启动新事务。在该请求结束时,应该进行任何更改。