2015-02-09 28 views
-1

晚上好,我想要做的是創建一個表單,您可以在其中註冊客戶端。但是,如果電子郵件數據庫中已存在,那麼它必須更新,如姓名爲同一電子郵件其他客戶端的數據,姓氏等如果客戶端電子郵件存在,則更新表格行mvc asp.net optimisticConcurrencyException

什麼從來就迄今所做的:

首先返回true或false取決於如果記錄是現有

public bool checkForExistingEmail(User user) 
    {    
     var res = (from c in db.Users 
        where c.Email == user.Email 
        select c).SingleOrDefault(); 
     if (res == null) 
     { 

      return false; 
     } 
     else { 
      return true; 
     } 

在這裏的創建方法IM tyring根據電子郵件更新用戶的數據,但appearently它不工作,我得到。 Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

public ActionResult Create(User user) 
    { 


     if (ModelState.IsValid && checkForExistingEmail(user) == false) 
     { 

      db.Users.Add(user); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     else if (checkForExistingEmail(user) == true) 
     { 

      db.Entry(user).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 

     } 
     return View(user); 
    } 

注: 從來就還我Create.cshtml文件添加隱藏@Razor元素@Html.HiddenFor(model => model.UserId)

+0

當你通過現有的代碼時會發生什麼..?當您嘗試執行所述操作時,是否返回多行? – MethodMan 2015-02-09 19:35:39

+0

是啊不止一個,我得到的例外,當我嘗試註冊現有的電子郵件,但與其他名字和姓氏 – 2015-02-09 19:37:33

+0

聽起來像你的初始問題/問題在於你的'linq查詢'如果這不是這樣的話那麼你的邏輯關於你如何更新實體對象需要肯定改變返回True/False並不能真正幫助你的情況在你現有的代碼中。 – MethodMan 2015-02-09 19:39:10

回答

1

假設實體框架:

而不是手動設置EntityState.Modified,我個人可能會做這樣的事情。

public ActionResult Create(User user) 
{ 
    var res = (from c in db.Users 
       where c.Email == user.Email 
       select c).SingleOrDefault(); 

    if(res == null) 
    { 
     db.Users.Add(user); 
    } 
    else 
    { 
     res.Prop1 = user.Prop1 
     res.Prop2 = user.Prop2 
     ... 
    } 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 
+0

這就是我正在尋找的,謝謝你現在完美的作品。 – 2015-02-09 19:53:29

相關問題