编辑动作保存输入错误

本文关键字:输入 错误 保存 编辑 | 更新日期: 2023-09-27 18:18:29

当我编辑一个"salesmember"并且我试图保存新文件路径/或旧文件路径时,根据用户输入,它应该覆盖图像,或者它将使用存储在DB中的先前图像。

但是,当我试图修改实体状态时,在我保存SQL Server中的更改之前,我得到错误:

类型为'System '的异常。InvalidOperationException'在EntityFramework.dll中发生,但未在用户代码中处理。附加信息:附加类型为"SalesMember"的实体失败,因为另一个相同类型的实体已经具有相同的主键值。当使用"Attach"方法或将实体的状态设置为"Unchanged"或"Modified"(如果图中的任何实体具有冲突的键值)时,可能会发生这种情况。这可能是因为一些实体是新的,还没有接收到数据库生成的键值。在这种情况下,使用"添加"方法或"添加"实体状态来跟踪图形,然后根据需要将非新实体的状态设置为"未更改"或"修改"。

我正在用那个主键修改SalesMember。它在本地保存图像,但不会保存DB行。

My Edit Action -----

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include="SalesMemberID,FirstName,LastName,PageName,CellPhone,Email,InactiveRedirectTo,CustomText,Photo,Active, Position")] SalesMember salesmember, HttpPostedFileBase file)
    {
        SalesMember SalesPhoto = db.SalesMembers.Find(salesmember.SalesMemberID);
        salesmember.Photo = saveImage(file, salesmember, SalesPhoto);

        if (ModelState.IsValid)
        {
            salesmember.AddDate = SalesPhoto.AddDate;
            salesmember.UpdateDate = DateTime.Now;
            salesmember.IPAddress = Request.UserHostAddress;
            salesmember.AddUser = "admin";
            salesmember.UpdateUser = "admin";
            db.Entry(salesmember).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(salesmember);
    }

SalesPhoto Save Function——

private string saveImage(HttpPostedFileBase file, SalesMember salesmember, SalesMember SalesPhoto = null)
    {
        string photo = "";
        string returnPhoto = "";
        //File blank
        if( file == null )
            //If File Path For that User Already In DB, return that File Path
            if(! String.IsNullOrEmpty(SalesPhoto.Photo))
                return "/Images/no-upload-icon.jpg"; 
        //If File ! empty, Save image uploaded
        photo = Server.MapPath("/Images/" + salesmember.PageName.ToString() + ".jpg");
        file.SaveAs(photo);
        returnPhoto = "/Images/" + salesmember.PageName.ToString() + ".jpg";
        return returnPhoto;
    }

我相信它与LINQ查询有关,因为当我删除LINQ查询&saveImage方法,只保存照片与测试路径(即。,"/Images/foo.jpg"),它工作。

提前感谢。

编辑动作保存输入错误

在实体框架中不能有两个具有相同主键的实体(相同类型)。salesmemberSalesPhoto如果您想在表单Edit中包含AddDate,您可以将其作为HiddenField包含在表单中,或者

我的建议是在视图中处理ViewModels而不是EF模型忽略这些问题

 [HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include="SalesMemberID,FirstName,LastName,PageName,CellPhone,Email,InactiveRedirectTo,CustomText,Photo,Active, Position")] SalesMember salesmember, HttpPostedFileBase file)
{
    SalesMember SalesPhoto = db.SalesMembers.AsNoTracking().Find(salesmember.SalesMemberID);
    salesmember.Photo = saveImage(file, salesmember, SalesPhoto);

    if (ModelState.IsValid)
    {
        salesmember.AddDate = SalesPhoto.AddDate;
        salesmember.UpdateDate = DateTime.Now;
        salesmember.IPAddress = Request.UserHostAddress;
        salesmember.AddUser = "admin";
        salesmember.UpdateUser = "admin";
        db.Entry(salesmember).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(salesmember);
}