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