【发布时间】: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