我使用通用存储库来介绍演示文稿和EF。我尝试更新时收到以下错误。
ObjectStateManager中已存在具有相同键的对象。 ObjectStateManager无法使用相同的键跟踪多个对象。
我知道这是因为EF不能拥有2个具有相同ID的实体。所以我需要将值分离或传递给新对象。我选择转移。但是我无法弄清楚如何以一种我不必每次传递它的方式来获取身份。
public virtual void Update(T entity)
{
Context.Entry(Context.Set<T>().Find(entity.~theentityid~)).CurrentValues.SetValues(entity);
Context.Entry(entity).State = EntityState.Modified;
}
编辑:行Context.Entry(Context.Set()。Find(entity .~theentityid~))。CurrentValues.SetValues(entity);在我开始收到错误以解决问题之后添加了。
我的标识列并非全部都是ID,因此我无法使用它。是否有一种通用的方法来获取身份值,无论传入哪种实体类型,以便我可以找到已经附加的实体。
编辑:根据评论我要包含更多代码。我的GalleryCollectionRepository继承了上面列出的通用存储库。
private static IntranetEntities db = new IntranetEntities();
private GalleryCollectionRepository GalleryCollectionRepo = new GalleryCollectionRepository(db);
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "collectionID,name,description,createdOn,createdByCommonName,createdByUsername,expirationDate,workOrderID")] GalleryCollection collection)
{
if (ModelState.IsValid)
{
GalleryCollectionRepo.Update(collection);
GalleryCollectionRepo.Save();
return RedirectToAction("Index");
}
return View(collection);
}
编辑表单是标准的自动生成表单。
这是表单顶部的一个示例,表单的其余部分都是标准的东西,所以不想让帖子真的很长但包括它。 @model Marketing.Models.GalleryCollection
@{
ViewBag.Title = "Edit";
Layout = "~/Areas/Intranet/Views/Shared/_Layout.cshtml";
}
<h2>Edit</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Collection</h4>
<hr />
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.collectionID)
<div class="form-group">
@Html.LabelFor(model => model.collectionName, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.collectionName)
@Html.ValidationMessageFor(model => model.collectionName)
</div>
</div>