Entity framework 数据库中未更新EF实体
这是我控制器中的代码:Entity framework 数据库中未更新EF实体,entity-framework,Entity Framework,这是我控制器中的代码: [HttpPost] public ActionResult UpdateArticle(Article article) { if (ModelState.IsValid) { article.DateAdded = this.articleRepository.GetSingle(article.ID).DateAdded; article.Dat
[HttpPost]
public ActionResult UpdateArticle(Article article)
{
if (ModelState.IsValid)
{
article.DateAdded =
this.articleRepository.GetSingle(article.ID).DateAdded;
article.DateModified = DateTime.Now;
this.articleRepository.Update(article);
return this.Redirect("~/Admin");
}
else
{
return this.Redirect("~/Admin/UnsuccessfulOperation");
}
}
从视图中更新数据。我有一个处理保存的通用存储库。
更新如下所示:
public virtual void Update(T entity)
{
//this.context.Entry(entity).State = EntityState.Modified;
this.context.SaveChanges();
}
public ActionResult UpdateArticle(Guid articleID)
{
if (ModelState.IsValid)
{
var article =
this.articleRepository.GetSingle(articleID);
article.DateModified = DateTime.Now;
this.articleRepository.Update(article);
return this.Redirect("~/Admin");
}
else
{
return this.Redirect("~/Admin/UnsuccessfulOperation");
}
}
如果我取消注释第一行
ObjectStateManager中已存在具有相同密钥的对象。ObjectStateManager无法跟踪多个
具有相同键的对象
异常被抛出。当注释时,不保存任何内容
感谢您的帮助
更新
好吧,问题似乎是更新的文章不是上下文的“一部分”,所以当我将其传递给更新时,什么都没有发生。如果我从存储库本身获取实体并传递新值,然后传递该实体,那么一切都会按预期工作。这段代码实际上更新了存储库中的日期:
var art = this.articleRepository.GetSingle(article.ID);
art.Text = article.Text;
this.articleRepository.Update(art);
我不明白的是这也行得通:
var art = this.articleRepository.GetSingle(article.ID);
art.Text = article.Text;
this.articleRepository.Update(article);
更新2
多亏了Vitaliy,我现在知道连接是关键,但当我尝试连接新实体时,我得到了同样丑陋的例外
已存在具有相同密钥的对象
更新3
由于我不能在8小时内回答自己的问题,我想我必须再做一次更新
好的,这就是我为了成功分离旧实体并连接新实体所做的:
public virtual void Update(T entity, object id)
{
this.context.Entry(this.GetSingle(id)).State = EntityState.Detached;
this.context.Entry(entity).State = EntityState.Added;
this.context.Entry(entity).State = EntityState.Modified;
this.context.SaveChanges();
}
我将考虑一种更好的传递ID的方法,因为它已经是实体的一部分,可能与接口“myInterface”一起传递,该接口中包含ID属性,T的类型为“myInterface”
非常感谢Vitaliy。您正在更新文章,该文章未附加到上下文,因此不会保存任何内容。 可能您的目的是更改DateModified,然后您应该这样做:
public virtual void Update(T entity)
{
//this.context.Entry(entity).State = EntityState.Modified;
this.context.SaveChanges();
}
public ActionResult UpdateArticle(Guid articleID)
{
if (ModelState.IsValid)
{
var article =
this.articleRepository.GetSingle(articleID);
article.DateModified = DateTime.Now;
this.articleRepository.Update(article);
return this.Redirect("~/Admin");
}
else
{
return this.Redirect("~/Admin/UnsuccessfulOperation");
}
}
有任何代码可以更新您的实体嗨,非常感谢。实际上,视图中的文章也带有更新的值。我在服务器上设置日期,因为用户不打算以任何方式编辑这些日期。以某种方式连接实体的最佳方式是什么?或者我只需要复制article参数的值?this.context.ArticleSet.Attach(article);this.context.Entry(article.State=EntityState.Modified;this.context.SaveChanges();在你前面一点:)。我无法分离旧实体,因此当我尝试附加新实体时,它只会抛出一个臭名昭著的错误,即具有相同键的对象已经存在。我正试图通过id分离旧实体,如下所示:
this.context.Entry(this.GetSingle(id)).State=EntityState.Detached我不知道这是怎么发生的,但不知怎么的,我什么也没做。但是,现在新值再次未保存,并且我正在成功附加新实体-我可以在上下文中看到更改,但之后我无法看到它们。我不能确定,但很可能在GetSingle()实现中的上下文中创建了副本。若您已经更改了对象,但不需要它,只需根据需要附加已更改状态的对象,然后激发SaveChanges。