-1

每当我尝试运行以下代码时,总是会收到此错误:

ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。

这是我的代码

// find assessmentcase that needs to be updated
var CaseToBeUpdated = db.AssessmentCases
                     .Where(c => c.CaseSeq == score.CaseSeq)
                     .FirstOrDefault();

// create new assessmentcase with updated data                    
AssessmentCase assessmentcase = new AssessmentCase
                                {
                                    CaseSeq = CaseToBeUpdated.CaseSeq,
                                    DateClosed = System.DateTime.Now,
                                    SeqClosedBy = SeqClosedBy,
                                    UserIdClosed = User.Identity.Name,
                                };

// save changes to assessment case table
db.Entry(assessmentcase).State = EntityState.Modified;
db.SaveChanges();

本质上,我正在尝试更新assessmentcase表中的一些数据。我究竟做错了什么?

4

2 回答 2

4

在第一行,您将实体加载到内存中,以便 EF 开始跟踪它。然后,您使用相同的 CaseSeq(我相信它是主键)创建另一个实体,然后尝试将其附加到 EF。因此,您有 2 个具有相同主键的实体。不要创建新对象。使用您从内存中加载的那个。

// find assessmentcase that needs to be updated
var CaseToBeUpdated = db.AssessmentCases
                     .Where(c => c.CaseSeq == score.CaseSeq)
                     .FirstOrDefault();

CaseToBeUpdated.DateClosed = System.DateTime.Now;
CaseToBeUpdated.SeqClosedBy = SeqClosedBy;
CaseToBeUpdated.UserIdClosed = User.Identity.Name;

// save changes to assessment case table
db.Entry(CaseToBeUpdated).State = EntityState.Modified;
db.SaveChanges();
于 2013-04-19T15:41:06.083 回答
2

为什么不简单地更新检索到的记录?

var CaseToBeUpdated = db.AssessmentCases
                 .Where(c => c.CaseSeq == score.CaseSeq)
                 .FirstOrDefault();

// create new assessmentcase with updated data                    
CaseToBeUpdated.DateClosed = System.DateTime.Now;
CaseToBeUpdated.SeqClosedBy = SeqClosedBy;
CaseToBeUpdated.UserIdClosed = User.Identity.Name;

// this should not be necessary ...   
db.Entry(CaseToBeUpdated).State = EntityState.Modified;
// save changes to assessment case table
db.SaveChanges();
于 2013-04-19T15:40:18.017 回答