0

我无法掌握 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 缓存的目的。但是,我也不希望我的测试用例数据过时。如何保持缓存同步?

4

1 回答 1

2

您是正确的,您不应该在每次保存后提交事务,但您的 Web 服务应该在 Web 调用开始时创建新事务并在 Web 调用结束时提交。

Web 服务通常遵循与网站通常遵循的每个请求相同的会话模式,因此请确保您的 Web 服务基础架构正在创建新的 NHibernate ISession 并针对每个请求启动新事务。在该请求结束时,它应该提交所做的任何更改。

于 2012-09-14T18:59:05.860 回答