EF更新与通用存储库错误

时间:2014-05-30 15:25:35

标签: asp.net-mvc entity-framework

我使用通用存储库来介绍演示文稿和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>

0 个答案:

没有答案