我用来从数据库中删除项目的方法抛出了错误 “无法删除该对象,因为在ObjectStateManager中找不到该对象。”
我在网上遵循了多个建议以尝试附加它,但是它又抛出了另一个错误 “附加类型为'databaseName'的实体失败,因为相同类型的另一个实体已经具有相同的主键值。在使用'附加'方法或将实体的状态设置为'未更改'或'已修改'时,可能会发生这种情况。如果图中的任何实体具有相互冲突的键值,这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,请使用“添加”方法或“已添加”实体状态来跟踪该图然后根据需要将非新实体的状态设置为“未更改”或“已修改”。”
public bool deleteItem(Item s)
{
bool success = false;
using (DBEntities cxt = new DBEntities())
{
var saving = (from i in cxt.Items
where i.Id == s.Id
select i).FirstOrDefault();
cxt.Entry(s).State = System.Data.Entity.EntityState.Deleted;
//cxt.Items.Attach(s);
cxt.Items.Remove(s);
int delete = cxt.SaveChanges();
if (delete == 1)
{
success = true;
}
return success;
}
}
答案 0 :(得分:1)
您可以使用一个数据库调用而不是2来执行此操作。附加实体,然后在DbSet上调用Remove将其删除。
public bool deleteItem(Item s)
{
bool success = false;
using (DBEntities cxt = new DecagonDBEntities())
{
cxt.Items.Attach(s);
cxt.Items.Remove(s);
int delete = cxt.SaveChanges();
bool success = delete == 1;
return success;
}
}
如果您仍然想检索它进行验证
public bool deleteItem(Item s)
{
bool success = false;
using (DBEntities cxt = new DecagonDBEntities())
{
var itemToDelete = cxt.Items.SingleOrDefault(_ => _.Id == s.Id);
// validate itemToDelete like check for null etc
cxt.Items.Remove(itemToDelete);
int delete = cxt.SaveChanges();
bool success = delete == 1;
return success;
}
}