C# 无法删除该对象,因为在ObjectStateManager中找不到该对象
我收到以下错误:“无法删除对象,因为在ObjectStateManager中找不到它。” 我的代码是:C# 无法删除该对象,因为在ObjectStateManager中找不到该对象,c#,asp.net,entity-framework-4,C#,Asp.net,Entity Framework 4,我收到以下错误:“无法删除对象,因为在ObjectStateManager中找不到它。” 我的代码是: protected MyEntities sqlEntities; public virtual void Delete(TEntity entity) { System.Type t = typeof(TEntity); sqlEntities.DeleteObject(entity); sqlEntities.Sav
protected MyEntities sqlEntities;
public virtual void Delete(TEntity entity)
{
System.Type t = typeof(TEntity);
sqlEntities.DeleteObject(entity);
sqlEntities.SaveChanges();
}
这意味着实体未被附加(它未被同一上下文实例加载)。试试这个:
protected MyEntities sqlEntities;
public virtual void Delete(TEntity entity)
{
sqlEntities.Attach(entity);
sqlEntities.DeleteObject(entity);
sqlEntities.SaveChanges();
}
您可以编写以下代码:
var x=yourquery.FirstOrDefault();
sqlEntities.DeleteObject(x);
sqlEntities.SaveChanges();
只是一个小的澄清(这应该是公认的答案) 如果像我一样,您的代码格式如下:
using (var context = new MyDataContext())
{
context.MyTableEntity.Remove(EntytyToRemove);
var nrOfObjectsChanged = context.SaveChanges();
}
…那么这就是你想要做的:
using (var context = new MyDataContext())
{
// Note: Attatch to the entity:
context.MyTableEntity.Attach(EntityToRemove);
context.MyTableEntity.Remove(EntityToRemove);
var nrOfObjectsChanged = context.SaveChanges();
}
也许这看起来很明显,但我一开始并不清楚是否有必要指定要附加到的实体,而不仅仅是上下文 仅就克雅尔坦的解释进行说明: 我有:
public Project DeleteProject(int id)
{
using (var context = new Context())
{
var p = GetProject(id);
context.Projects.Remove(p);
context.SaveChanges();
return p;
}
}
问题是我使用自己的方法(GetProject())来获取实体(因此使用另一个上下文来加载实体):
一种解决方案可以是按照Kjartan的说法附加加载的实体,另一种解决方案可以是mine解决方案,以便在相同的上下文中加载实体:
public Project DeleteProject(int id)
{
using (var context = new Context())
{
var p = context.Projects.SingleOrDefault(x => x.Id == id);
if (p == null)
return p;
context.Projects.Remove(p);
context.SaveChanges();
return p;
}
}
您应该确保您的对象存在于要从中删除的列表中, 您应该设置以下条件 if(context.entity.contains(您的对象)) 移除它 如果等式的条件复杂,则应覆盖 实体类中的equal方法来设置相等条件,
要获取扩展方法实体的正确方式,请确保传入Remove(实体)的模型与数据库记录完全相同 有时,传递模型时可能不带Id或Date等字段。如果您以表单形式发布,请将其保存在@html.Hiddenfor中 最好的方法是使用Find(ID)方法传递ID并获取实体,然后将其传递给Remove(entity)
希望这对某人有所帮助。如果上述方法均无效,您可以尝试以下解决方案:
context.Entry(yourObject).State=System.Data.Entity.EntityState.Deleted;
SaveChanges();
我知道这个问题很老了,但上面的问题对我都不起作用,因为我从多个类/服务中删除了寄存器,并且每个类/服务都实例化了自己的数据库连接上下文
我所做的是将第一个创建的上下文发送到要访问数据库的其余类/服务
例如,我的serviceA
将删除它的一些寄存器,并调用serviceB
和serviceC
对它们的寄存器执行相同的操作
然后,我将删除
serviceA
上的寄存器,并将serviceA
上创建的上下文作为参数传递给serviceB
和serviceC
我得到了这个问题并解决了它。只需复制以下代码:
sqlEntities.Attach(entity);
sqlEntities.Remove(entity);
sqlEntities.SaveChanges();
在我的例子中,有一个上下文,但我得到了一个带有'AsNoTracking'选项的实体很抱歉,代码中出现了一个问题,使用了不同的datacontext对象来获取和删除记录;删除对象(实体)代码>我试图创建一个PK设置正确的模拟实体,希望实体框架能够基于PKISLAV调用DeleteObject。当我从父对象中删除子数据时,有两个上下文在进行,这对我很有帮助,父对象数据是在TransactionScope之外的不同上下文中调用的。将父调用移到作用域和同一上下文中,我的问题就解决了。@Ladislav:如果我使用.Attach,我将得到一个不同的错误:“一个实体对象不能被多个IEntityChangeTracker实例引用。”这是否意味着已经有其他对象实例处于活动状态,无法删除?@Matt:不,这意味着您的对象已附加到另一个上下文。它不能同时连接到两个。您应该使用原始上下文来删除实体。@Ladislav:谢谢,这帮助我进一步查找-我发现了这个问题,似乎可以回答如何解决它:。你是对的,这似乎是我的问题。谢谢你的快速回答!感谢提醒,我只是在更新记录时附加了它,而不是在删除记录时附加了它。我使用此方法并收到异常:“Store update、insert或delete语句影响了意外的行数(0)。自加载实体后,实体可能已被修改或删除。刷新ObjectStateManager条目。”
sqlEntities.Attach(entity);
sqlEntities.Remove(entity);
sqlEntities.SaveChanges();