我想在使用Find方法后修改实体,但它会引发错误:
附加“Models.Pages”类型的实体失败,因为同一类型的另一个实体已具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图表,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。
代码:
media = db.Pages.Find(page.PageID).Media;
.
.
.
db.Entry(page).State = EntityState.Modified;
db.SaveChanges();
(页面从视图发布)
答案 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();
编辑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();
}