该对象不能被删除,因为它在ObjectStateManager中找不到

我得到这个错误“对象不能被删除,因为它没有在ObjectStateManager中find。

我的代码是:

protected MyEntities sqlEntities; public virtual void Delete(TEntity entity) { System.Type t = typeof(TEntity); sqlEntities.DeleteObject(entity); sqlEntities.SaveChanges(); } 

这意味着实体没有被连接(它没有被相同的上下文实例加载)。 尝试这个:

 protected MyEntities sqlEntities; public virtual void Delete(TEntity entity) { sqlEntities.Attach(entity); sqlEntities.DeleteObject(entity); sqlEntities.SaveChanges(); } 

拉米斯拉夫•姆尔卡(Ladislav Mrnka)的回答只是一个小小的澄清(应该是被接受的答案)。

如果像我一样,你有这样的格式的代码:

 using (var context = new MyDataContext()) { context.MyTableEntity.Remove(EntytyToRemove); var nrOfObjectsChanged = context.SaveChanges(); } 

..然后这个你想要做的:

 using (var context = new MyDataContext()) { // Note: Attatch to the entity: context.MyTableEntity.Attach(EntityToRemove); context.MyTableEntity.Remove(EntityToRemove); var nrOfObjectsChanged = context.SaveChanges(); } 

也许这似乎是显而易见的,但最初我不清楚是否有必要指定实体来贴近,而不仅仅是上下文

只是对Kjartans解释:

我有:

 public Project DeleteProject(int id) { using (var context = new Context()) { var p = GetProject(id); context.Projects.Remove(p); context.SaveChanges(); return p; } } 

问题是我用我自己的方法(GetProject())来获取实体(因此使用另一个上下文来加载实体):

 public Project GetProject(int id) { using (var context = new Context()) { var project = context.Projects .Include(p => p.Reports.Select(q => q.Issues.Select(r => r.Profession))) .Include(p => p.Reports.Select(q => q.Issues.Select(r => r.Room))) .SingleOrDefault(x => x.Id == id); return project; } } 

一种解决scheme可能是将加载的实体附加为Kjartan状态,另一个可能是我的解决scheme,以在相同的上下文中加载实体:

 public Project DeleteProject(int id) { using (var context = new Context()) { var p = context.Projects.SingleOrDefault(x => x.Id == id); if (p == null) return p; context.Projects.Remove(p); context.SaveChanges(); return p; } } 

你可以写这个代码:

 var x=yourquery.FirstOrDefault(); sqlEntities.DeleteObject(x); sqlEntities.SaveChanges(); 

如果没有以上的工作,你可以尝试这个解决scheme:

context.Entry(yourObject).State = System.Data.Entity.EntityState.Deleted; context.SaveChanges();

我知道这个问题是相当古老的,但以上都没有为我工作,因为我是从多个类/服务中删除寄存器,其中每个实例化它自己的数据库连接上下文。

我解决这个问题的方法是将第一个创build的上下文发送到其他要访问数据库的类/服务。

例如,我的serviceA正在删除它的一些寄存器,并调用serviceBserviceC对它们的寄存器执行相同操作。

然后,我将删除我在serviceA注册,并将serviceA上创build的上下文作为parameter passing给serviceBserviceC

你应该确定你的对象是存在于你想要删除的列表中,你应该把下面的条件

如果(context.entity.contains(你的对象))

去掉它。

如果你有一个平等的复杂条件, 你应该在实体类中重写平等的方法,把你的条件相等,以获得正确的方式扩展方法“entity.contains”

确保传入Remove(Entity)的模型与数据库logging完全相同。

有时候可能会将模型传出一些字段,如Id或Date。 把这些留在@ html.Hiddenfor如果你张贴为表单。

最好的方法是传递ID并使用Find(Id)方法获取实体,并将其传递给Remove(实体)

希望这有助于某人。