无法删除该对象,因为在entity framework5中的ObjectStateManager中找不到该对象
我正在尝试使用EntityFramework 5删除对象,但我收到此错误。 无法删除该对象,因为在ObjectStateManager中找不到该对象
我正在使用Remove()
方法,因为在EF5中不存在DeleteObject()
。 任何人都可以帮助我错过了什么吗?
这对删除不起作用
localDb.Customers.Remove(new Customer() { CustomerId = id }); localDb.SaveChanges();
我尝试从msdn将状态更改为Deleted的另一件事。 但在这里它给出了一个错误,说所有字段都应该存在。 是否有必要获取完整的记录然后删除?
var customer = new Customer(){ CustomerId = id }; localDb.Customers.Attach(customer); localDb.Entry(customer).State = EntityState.Deleted; localDb.SaveChanges();
有什么输入?
您可以从数据库中获取该行,然后将其删除,但这会导致两次往返数据库。
如果您想在一次点击中执行此操作,则使用Attach
的第二个版本将起作用 – 只要该实体尚未加载到上下文中。
您获得的错误是由在任何数据库写入之前运行的EFvalidation引起的。
您可以暂时将其关闭,如下所示:
bool oldValidateOnSaveEnabled = localDb.Configuration.ValidateOnSaveEnabled; try { localDb.Configuration.ValidateOnSaveEnabled = false; var customer = new Customer { CustomerId = id }; localDb.Customers.Attach(customer); localDb.Entry(customer).State = EntityState.Deleted; localDb.SaveChanges(); } finally { localDb.Configuration.ValidateOnSaveEnabled = oldValidateOnSaveEnabled; }
如果您从数据库中检索了对象,那么它已经附加到上下文中,因此您可以通过以下方式删除:
db.myTable.Remove(model);
但
如果你只是通过邮件接收模型或删除视图或自己生成它以避免2次访问数据库然后EF不知道它并且你得到上面的行错误(..在ObjectStateManager中找不到..)所以你将其状态设置为“已删除”以通知EF :
//generate it yourself if not posted from edit/delete view //var model = new Model { Id = 123 }; //set to delete db.Entry(model).State = EntityState.Deleted; db.SaveChanges();
你能做到吗?
var customer = localDb.Customers.Single(o => o.CustomerId == id); localDb.Customers.Remove(customer); localDb.SaveChanges();
public T Delete(T obj) where T : class { T existing = context.Set ().Find(GetKeys(obj, context)); if (existing != null) { context.Set ().Remove(existing); context.SaveChanges(); return existing; } return null; } private object[] GetKeys (T entity, DbContext context) where T : class { ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext; ObjectSet set = objectContext.CreateObjectSet (); var keyNames = set.EntitySet.ElementType .KeyMembers .Select(k => k.Name).ToArray(); Type type = typeof(T); object[] keys = new object[keyNames.Length]; for (int i = 0; i < keyNames.Length; i++) { keys[i] = type.GetProperty(keyNames[i]).GetValue(entity, null); } return keys; }
我知道这个问题很老,但上面没有一个对我有用,因为我一次从多个类/服务中删除寄存器,并且每个都在实例化它自己的数据库连接上下文。
我所做的就是将第一个创建的上下文发送到将要访问数据库的其他类/服务。
例如,我的serviceA
将删除其中的一些寄存器,并调用serviceB
和serviceC
对其寄存器执行相同操作。
然后,我将删除serviceA
寄存器,并将serviceA
上创建的上下文作为参数传递给serviceB
和serviceC
。