该对象不能被删除,因为它在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
正在删除它的一些寄存器,并调用serviceB
和serviceC
对它们的寄存器执行相同操作。
然后,我将删除我在serviceA
注册,并将serviceA
上创build的上下文作为parameter passing给serviceB
和serviceC
。
你应该确定你的对象是存在于你想要删除的列表中,你应该把下面的条件
如果(context.entity.contains(你的对象))
去掉它。
如果你有一个平等的复杂条件, 你应该在实体类中重写平等的方法,把你的条件相等,以获得正确的方式扩展方法“entity.contains”
确保传入Remove(Entity)的模型与数据库logging完全相同。
有时候可能会将模型传出一些字段,如Id或Date。 把这些留在@ html.Hiddenfor如果你张贴为表单。
最好的方法是传递ID并使用Find(Id)方法获取实体,并将其传递给Remove(实体)
希望这有助于某人。
- jquery asp.netbutton通过ajax点击事件
- 获取DisplayName属性,而不使用asp.net MVC中的LabelFor Helper
- redirect到ASP.Net中的当前页面
- SignalR – 使用(IUserIdProvider)向特定用户发送消息* NEW 2.0.0 *
- 在MVC中显示标准数据表
- VS2012 – Web表单 – 捆绑混乱
- ASP.NET Web窗体中的jQueryvalidation插件
- 中继器,ListView,DataList,DataGrid,GridView …哪个可以select?
- 新的Asp.Net MVC5项目产生一个无限循环login页面