2016-11-17 46 views
0

當我編輯「salesmember」我試圖保存新文件的路徑/或舊的文件路徑,根據用戶的輸入,它應該是覆蓋圖像,或者將使用存儲在數據庫中的以前的圖像。MVC 5編輯操作保存輸入錯誤

但是,當我嘗試修改實體狀態,之前我保存我的SQL Server的變化,我得到的錯誤:

An exception of type 'System.InvalidOperationException' occured in EntityFramework.dll but was not handled in user code. Additional information: Attaching an entity of type 'SalesMember' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate.

我修改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查詢,當我刪除了LINQ查詢& saveImage方法,並保存照片與測試路徑(即「/Images/foo.jpg」),它的工作原理。

在此先感謝。

回答

0

你不能擁有兩個實體(同類型)與存儲相同的主鍵在實體框架。 salesmemberSalesPhoto如果你想有AddDate編輯表單,您可以將其包含在形式的HiddenField,或者

my recommendation is to deal with ViewModels not EF models in views to ignore these Issues

[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); 
} 
+0

如果我從我的觀點結合值salesmember,當我打電話分貝.SalesMembers.Find,並將退貨銷售人員分配給「salesmember」,是否不會覆蓋銷售員中以前綁定的所有值? –

+0

@DaveBoz是的,它會(我的理解有些不對勁),包括你想要的一切在表單POST作爲HiddenFileds,你會一炮打響保存到數據庫或處理的ViewModels,你可以嘗試其他的東西(notracking),但不是100%肯定它將工作或沒有 –

+0

@DaveBoz你可以試試'AsNoTracking'告訴我它是如何工作的? –