无法删除该对象,因为在实体框架5中的ObjectStateManager中找不到该对象

Ram*_*yad 15 c# entity-framework-5

我正在尝试使用EntityFramework 5删除对象,但我收到此错误. 无法删除该对象,因为在ObjectStateManager中找不到该对象
我正在使用EF5中不存在的Remove()方法DeleteObject().任何人都可以帮助我错过的东西吗?

这对删除不起作用

localDb.Customers.Remove(new Customer() { CustomerId = id });
                localDb.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

我尝试从msdn将状态更改为Deleted的另一件事.但在这里它给出了一个错误,说所有的字段都应该存在.是否有必要获取完整的记录然后删除?

var customer = new Customer(){ CustomerId = id };
                localDb.Customers.Attach(customer);

                localDb.Entry(customer).State = EntityState.Deleted;
                localDb.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

有什么投入?

Nic*_*ler 28

您可以从数据库中获取该行,然后将其删除,但这会导致两次往返数据库.

如果你想在一次点击中完成它,你的第二个版本Attach将起作用 - 只要该实体尚未加载到上下文中.

您获得的错误是由在任何数据库写入之前运行的EF验证引起的.

您可以暂时将其关闭,如下所示:

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;
}
Run Code Online (Sandbox Code Playgroud)


Moj*_*oji 9

如果您从数据库中检索了对象,那么它已经附加到上下文中,因此您可以通过以下方式删除:

db.myTable.Remove(model);
Run Code Online (Sandbox Code Playgroud)

但是
如果你只是通过邮寄接收模型或删除视图或自己生成它以避免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();
Run Code Online (Sandbox Code Playgroud)