如果客户端电子邮件存在,则更新 table 行 mvc asp.net optimisticConcurrencyException

Updating table row if clients email exists 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;
        }

在创建方法中,我尝试根据电子邮件更新用户数据,但显然它不起作用,我明白了。 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)

假设Entity framework:

与其手动设置 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");
}