如何在Entity Framework中使用Find()方法后将State设置为Modified

时间:2015-03-11 15:03:22

标签: c# asp.net-mvc entity-framework

我想在使用Find方法后修改实体,但它会引发错误:

  

附加“Models.Pages”类型的实体失败,因为同一类型的另一个实体已具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图表,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。

代码:

 media = db.Pages.Find(page.PageID).Media;
.
.
.
db.Entry(page).State = EntityState.Modified;
  db.SaveChanges();

(页面从视图发布)

2 个答案:

答案 0 :(得分:1)

尝试执行以下操作,而不是直接设置状态:

//db.Entry(page).State = EntityState.Modified;



    db.Attach(page); 
    db.Entry(page).State = EntityState.Unchanged; 

    media = db.Pages.Find(page.PageID).Media;
    .
    .
    .
    db.Entry(page).State = EntityState.Modified;


    db.SaveChanges();

MS link

编辑1: 尽量避免使用.AsNoTracking方法跟踪第一个DBSet:

Media = db.Pages.AsNoTracking().Find(page.PageID).Media;

答案 1 :(得分:0)

我认为问题可能是你没有发布第一个dbContext,这样你就会创建同一个实体的两个引用,并且你会得到错误。

你应该做这样的事情

Media test;
//1. Get your element
using (var db1 = new MediaDBEntities())
{
  test = db1.Pages.Find(page.PageID);
}

//2. do other operations


//now save using new Context
using (var db2 = new SchoolDBEntities())
{
  //3. Mark entity as Unchanged
   db2.Entry(test).State = System.Data.Entity.EntityState.Unchanged;     

   //4. call SaveChanges
   db2.SaveChanges();
}