2016-11-17 8 views
0

"salesmember"を編集しているときに、ユーザー入力に基づいて新しいファイルパスまたは古いファイルパスを保存しようとすると、画像を上書きするか、 DBに保存されている前の画像を使用します。MVC 5編集アクション入力エラーを保存する

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を変更している:私は私のSQL Serverでの変更を保存する前に、エンティティの状態を変更しようとすると、

しかし、私がエラーを取得します。これは、イメージをローカルに保存しますが、DB行を保存しません。

私の編集アクション-----

[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

Entity Frameworkのメモリに同じ主キーを持つ2つのエンティティ(同じ種類)を使用することはできません。 salesmemberSalesPhotoあなたは、フォームの編集でAddDateを持つようにしたい場合は、私はデシベルを呼び出すときに、私は、私の見解からsalesmemberに値を結合していた場合は、フォームで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

としてそれを含めることができます.SalesMembers.Find、返品salesmemberを "salesmember"に割り当てます。これは以前にsalesmemberにバインドされたすべての値を上書きしませんか? –

+0

@DaveBozはい、それは(間違ったことを理解しています)、HiddenFiledsとしてフォーム投稿に必要なものをすべて含め、データベースへのヒットを保存したり、ViewModelsを処理したり、何か他のもの(notracking)を試すことはできますが、100% –

+0

@DaveBozあなたは 'AsNoTracking'を試して、それがどのように動作するか教えてください。 –

関連する問題