繁体   English   中英

MVC 5编辑操作保存输入错误

[英]MVC 5 Edit Action Saving Input Error

当我编辑“销售员”时,我试图根据用户输入保存新的文件路径或旧的文件路径,它应该覆盖图像,或者将使用存储在数据库中的先前图像。

但是,当我尝试修改实体状态时,在将更改保存到SQL Server中之前,出现了以下错误:

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

我正在使用该主键修改SalesMember。 这样,它将在本地保存图像,但不会保存数据库行。

我的编辑动作-----

    [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保存功能-

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 Query有关,因为当我删除LINQ Query&saveImage方法并仅使用测试路径(即“ /Images/foo.jpg”)保存照片时,它就可以工作。

提前致谢。

实体框架中的内存中不能有两个具有相同主键的实体(相同类型)。 salesmemberSalesPhoto如果你想有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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM