"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")で写真を保存するだけで動作します。
ありがとうございます。
としてそれを含めることができます.SalesMembers.Find、返品salesmemberを "salesmember"に割り当てます。これは以前にsalesmemberにバインドされたすべての値を上書きしませんか? –
@DaveBozはい、それは(間違ったことを理解しています)、HiddenFiledsとしてフォーム投稿に必要なものをすべて含め、データベースへのヒットを保存したり、ViewModelsを処理したり、何か他のもの(notracking)を試すことはできますが、100% –
@DaveBozあなたは 'AsNoTracking'を試して、それがどのように動作するか教えてください。 –