【问题标题】:Nhibernate, after insert, selecting the table results are oldNhibernate,插入后,选择表结果是旧的
【发布时间】:2014-05-30 19:03:47
【问题描述】:

使用 MS VS 2012、C#.net、Nhibernate。

我正在插入一个新行。

[HttpPost]
    public ActionResult AddQuestion(ModuleAddQuestionModel model)
    {
        if (!_moServices.Authoriser.Authorise(AcademyPermissions.AccessDeveloperArea))
            return new HttpUnauthorizedResult();

        if (model == null)
            return HttpNotFound();

        int modelId = 0;
        var module = _moduleService.GetModule(model.ModuleId);
        // if null
        
        if(model != null)
        {
            modelId = model.ModuleId;
        }
        
        var addQuestion = new Question()
        {
            Text = model.Question,
            QuestionType = model.QuestionType,
            Published = model.Published,
            Country = module.Country,
            Module = module
        };

        _moduleService.SaveQuestion(addQuestion);
        
        
        return RedirectToAction(
            "Edit",
            "Module",
            new { Id = modelId }
            );
    }

重定向调用

public ActionResult Edit(int Id) {
        if (!_moServices.Authoriser.Authorise(AcademyPermissions.AccessDeveloperArea))
            return new HttpUnauthorizedResult();

        var module = _moduleService.GetModule(Id);
        if(module == null)
            return HttpNotFound();

        var model = new ModuleEditModel {
            Id = module.Id,
            Name = module.Name,
            Questions = module.Questions
                .Where(x => !x.Deleted)
                .Select(x => new ModuleEditModel.ModuleQuestionModel {
                    Id = x.Id,
                    Question = x.Text
                }).ToList(),
            Videos = module.Videos.Select(x => new ModuleEditModel.ModuleVideoModel {
                    Id = x.Id,
                    Title = x.Name
                }).ToList()
        };

        return View(model);
    }

视图显示结果,它应该显示一个包含新行的列表,但没有,即使在 f5 之后。我怀疑它正在缓存,但我们没有在整个过程中涉及任何缓存。下一步是研究 Nhibernate 和缓存。

有两个相关的方法

public Module GetModule(int id) {
        _moduleRepository.Flush();
        return _moduleRepository.Get(id);
    }

public void SaveQuestion(Question question) {
        if (question.Id > 0)
            UpdateQuestion(question);
        else
            InsertQuestion(question);
    }

    public void InsertQuestion(Question question) {
        _questionRepository.Create(question);
        _questionRepository.Flush();
        _signals.Trigger(ModuleSignalChanged);
    }

我最近添加了.flush 命令以查看这是否有助于清除结果,但没有改变任何内容。

查看了Isession.Clear();,但据我所知,在我们的 cms 中,这超出了范围。

我想知道这里的问题是什么,我在正确的轨道上吗?这是 NHibernate 缓存问题吗?谁能提供解决方案?

如果您需要任何其他信息,请告诉我。

附加信息:

是的,插入确实填充了数据库(MS SQL server 2008)

几分钟后出现,如果刷新页面,就会显示新记录。

【问题讨论】:

  • 是的,我不生成新的问题 ID,我让服务器这样做。编辑操作通过模块 ID 调用 GetModule 服务。模块 ID 取自传递的模型 ModuleID。是的,如果模型由于某种原因为空,它只是将 0 作为 id 传递,它不会带回任何数据,而是显示一个空白列表。这有帮助吗?
  • 我的意思是,用于重定向的 ID 稍后会在调用 GetQuestion(Id)...我希望我们将看到 var questionId = ... 而不是这个 void 调用 _moduleService.SaveQuestion(addQuestion); 并且应该将其传递给 redirect
  • 刚刚意识到我发布了错误的操作 xD 难怪我没看懂,2 秒错误更新,抱歉
  • 此外,NHibernate 的工作方式也如您所愿。所以,除非有明确使用的缓存......它不会被缓存 - 因为我希望你实例化 ISession 每个请求。也许显示更多你的代码......
  • 好吧,我在这里看到的是构建问题时的这个任务:Module = module。我还建议使用module.Questions.Add(question) 之类的下一个电话来扩展它。如果模块被缓存,那么这将解决问题;)

标签: c# asp.net-mvc-4 caching nhibernate


【解决方案1】:

这就是答案

var addQuestion = new Question()
        {
            Text = model.Question,
            QuestionType = model.QuestionType,
            Published = model.Published,
            Country = module.Country,
            Module = module
        };

        module.Questions.Add(addQuestion);
        _moduleService.UpdateModule(module);

我没有尝试插入问题,而是更新了模块,而不是该问题是其子元素。由于强制 nhibernate 清除缓存并检查数据库的关系,我假设级联。

我无法确认这一点,但这似乎至少解决了这个问题,如果有人能告诉我为什么以前的方法不起作用,请交换我确认的答案

【讨论】:

    猜你喜欢
    • 2021-01-23
    • 2017-01-05
    • 2022-07-28
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 2014-08-01
    • 2017-08-30
    相关资源
    最近更新 更多