db.SaveChanges在数据库中保存记录但应用程序不更新

时间:2015-03-12 16:06:09

标签: c# asp.net asp.net-mvc entity-framework

我试图通过AJAX POST改变用户当前的文化:

$.ajax({
    type: 'POST',
    url: '/Account/SetDefaultCulture',
    data: data,
    dataType: 'JSON',
    success: function (result) {
      location.reload(true);
    }
  });

使用此控制器方法:

private readonly AspEntities db = new AspEntities();
[HttpPost]
    public JsonResult SetDefaultCulture(string userName, string culture)
    {
      if (!userName.IsNullOrEmpty())
      {
        var user = (from a in _db.AspNetUsers
                where a.UserName == userName
                select a).FirstOrDefault();
        if (user != null)
        {
          user.Culture = culture;
          db.SaveChanges();
          Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture = new CultureInfo(culture);
          return Json(new { culture, success = true });
        }
      }

      return Json(new {culture, success = false});
    }

如果我在调试时单步执行,我可以在调用db.SaveChanges()后立即看到数据库记录更新。

问题是应用程序/网站在更改Controller中的某些代码之后不会更新用户的文化,然后再次构建项目。它几乎就像文化被缓存在应用程序中一样。

我一定错过了什么。这是常见的吗?有没有人遇到过这个?

修改

我正在使用效用方法来检查当前用户的文化:

public static CultureInfo GetCulture()
{
  var userId = HttpContext.Current.User.Identity.GetUserId();
  var user = (from a in _db.AspNetUsers
              where a.Id == userId
              select a).FirstOrDefault();
  var culture = "en-CA";

  if (user != null)
  {
    if (!user.Culture.IsNullOrEmpty())
    {
      culture = user.Culture;
    }
  }

  return new CultureInfo(culture);
}

在每个页面上运行的过滤器中:

public class CheckCultureAttribute : ActionFilterAttribute
{
  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    HttpContext ctx = HttpContext.Current;
    string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower().Trim();
    string actionName = filterContext.ActionDescriptor.ActionName.ToLower().Trim();

    //Set Culture
    var culture = (ctx.User != null) ? Utilities.GetCulture() : new CultureInfo("en-CA");
    Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture = culture;

    ...
  }
}

如果我启动调试器并逐步执行此过滤器,GetCulture()方法将返回未更新的值(与数据库中已更新的值不匹配)

4 个答案:

答案 0 :(得分:1)

似乎EF没有跟踪您的更改。 试试这样的事情,

db.Entry(AspNetUsers).State = EntityState.Modified;

之前:db.SaveChanges();

此外,您正在查询_db上下文,而我可以看到您的上下文 private readonly AspEntities db = new AspEntities();

哪些提示您的上下文设置不正确?不知道我是否正确,但要检查你的背景。

答案 1 :(得分:0)

暂无评论,但您检查了this other stack overflow question

根据该链接,似乎动作过滤器已经来不及为请求设置文化。

答案 2 :(得分:0)

检查您是否正在引用应该生成更新的控制器中已经实例化的数据库上下文(AspEntities db)中的数据。除非您始终创建新的控制器对象,否则readonly修饰符将阻止声明后的更改。

答案 3 :(得分:-1)

我认为您首先必须将用户附加到您的DbContext。

db.AspNetUsers.Attach(user);

然后调用保存更改。每次我遇到更新我的数据库的问题时,这都是原因。我相信你也必须在这次更新后刷新页面。