我有这个通常有效的代码:
db.myTable.DeleteObject(myCurrent);
我收到了这个错误:
The object cannot be deleted because it was not found in the ObjectStateManager.
数据库中的表格中包含相同的成分。
我试过了:
db.myTable.Attach(myCurrent);
db.myTable.DeleteObject(myCurrent);
我又得到了一个错误:
An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
如何解决这个问题?
答案 0 :(得分:26)
问题是您无法删除(或删除)已分离的实体,并且无法附加实体两次。你需要像下面这样的东西。
var entry = db.Entry(myCurrent);
if (entry.State == EntityState.Detached)
db.myTable.Attach(myCurrent);
db.myTable.Remove(myCurrent);
答案 1 :(得分:10)
如果您刚刚通过邮件接收编辑或删除视图模型或自己生成模型,那么EF不知道它,因此您将其状态设置为“已删除”(或EntityState.Modified等)以通知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; // or EntityState.Modified for edit etc.
db.SaveChanges();
答案 2 :(得分:9)
另一个答案没有用,所以这就是我修复它的方法。
以前我曾经:
public void ok(myTable myCurrent)
{
//delete entries from other tables in relationship with myTable
db.myTables.DeleteObject(myCurrent);
}
我用它修理了它:
public void ok(int current_id)
{
//delete entries from other tables in relationship with myTable
var y = (from x in db.myTables where x.id == current_id select x).First();
db.myTables.DeleteObject(y);
}
答案 3 :(得分:3)
虽然这个问题是一个老问题,但它可能会帮助另一个有同样错误的人,
在我的情况下,问题是我提取数据AsNoTracking,通过删除AsNoTracking它解决了。
答案 4 :(得分:1)
我在这里找到了答案:
http://www.entityframeworktutorial.net/delete-entity-in-entity-framework.aspx
这是我需要的“断开连接”版本;
Student stud = null;
using (SchoolDBContext ctx = new SchoolDBContext())
{
stud = (from s in ctx.Students
where s.StudentName == "Student1"
select s).FirstOrDefault();
}
using (SchoolDBContext newCtx = new SchoolDBContext())
{
newCtx.Students.Attach(stud);
newCtx.Students.DeleteObject(stud);
//you can use ObjectStateManager also
//newCtx.ObjectStateManager.ChangeObjectState(stud,
System.Data.EntityState.Deleted);
int num = newCtx.SaveChanges();
}
答案 5 :(得分:1)
在我的情况下,我试图删除一个未从数据库表中取出的对象"学生"。 删除对象的错误方法:
var objStudent = new Student(); db.Student.Remove(objStudent);
所以要照顾好这个。要删除的对象应该来自表
答案 6 :(得分:0)
我遇到了同样的问题。在我的情况下,我一直在使用两个不同的DBContext实例来检索数据并更新/删除。然后我在相同的代码块/方法/类中使用相同的实例进行所有数据库操作,然后解决问题
答案 7 :(得分:0)
我在这里找到了答案。 我也尝试了它的工作方式:
dbEntities.Entry(CurrentObj).State = EntityState.Deleted;
dbEntities.SaveChanges();