2015-03-02 79 views
1

我已經添加了一個布爾值「ChangedPassword」到我的數據庫。我必須強制用戶在首次登錄時更改密碼。不會保存編輯

他們更改密碼後,布爾值必須更改爲true。它正在工作,但它不會保存它。

我的代碼:

 // POST: /Manage/ChangePassword 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> ChangePassword(ChangePasswordViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 
     var result = await UserManager.ChangePasswordAsync(User.Identity.GetUserId(), model.OldPassword, model.NewPassword); 
     if (result.Succeeded) 
     { 
      var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); 
      if (user != null) 
      { 
       await SignInAsync(user, isPersistent: false); 
      } 
      SidewindContext db = new SidewindContext(); 

      if (user.ChangedPassword == false) 
      { 
       user.ChangedPassword = true; 
      } 
      db.SaveChanges(); 

      return RedirectToAction("Index", new { Message = ManageMessageId.ChangePasswordSuccess }); 
     } 
     AddErrors(result); 
     return View(model); 
    } 

我不知道如果我需要db.SaveChanges但它不使用或不工作。 有什麼想法?讓我知道。

+0

'user'不在同一上下文中'db'。 – 2015-03-02 13:17:10

+0

要麼使用'SidewindContext'本身,而不使用'UserManager'並將'true'指定給'ChangedPassword',或者在用戶管理器中創建一個將'true'指定給'ChangedPassword'的方法,該方法使用上下文'UserManager'正在使用 – Amila 2015-03-02 14:22:55

回答

3

您需要Attach新創建的DbContext中的對象,以便EntityFramework開始跟蹤對象的更改。沒有它,你新創建的上下文知道什麼都沒有關於對user對象的更改。

SidewindContext db = new SidewindContext(); 

db.Attach(user); 

if (user.ChangedPassword == false) 
{ 
    user.ChangedPassword = true; 
} 

db.SaveChanges(); 
+0

這可能是一個愚蠢的問題,但我的db不會識別Attach?我已經嘗試了多個比賽,但沒有找到方法附加 – 2015-03-02 13:36:53

+0

@DannyBrouwer您是否嘗試過我的解決方案? – 2015-03-02 13:38:25

+1

@DannyBrouwer奇怪,您使用的是什麼版本的EntityFramework?它應該在'System.Data.Objects'中,你可能需要一個'using'指令(參見:https://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.attach% 28v = vs.110%29.aspx) – mattytommo 2015-03-02 13:38:50

1

我想你應該試試這個

db.Entry(user).State = System.Data.EntityState.Modified; 
db.SaveChanges();