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

时间:2015-02-09 19:29:31

标签: c# asp.net-mvc code-first

晚上好,我想做的是创建一个可以注册客户的表单。但是,如果电子邮件已经存在于数据库中,那么它必须更新同一电子邮件的其他客户端数据,例如firstname,lastname等。

到目前为止我做了什么:

首先返回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)

1 个答案:

答案 0 :(得分: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");
}