对象不能被删除,因为它是在ObjectStateManager在实体框架5未找到(The objec

2019-07-23 12:43发布

我试图删除使用的EntityFramework 5的对象,但我得到这个错误。 对象不能被删除,因为它没有在ObjectStateManager发现
我使用的Remove()方法DeleteObject()中不存在EF5。 谁能帮我失去了什么?

这并不适用于所有的工作

localDb.Customers.Remove(new Customer() { CustomerId = id });
                localDb.SaveChanges();

我从MSDN尝试另一件事改变状态已删除。 但在这里它提供了一个错误,说所有的字段应该存在。 是否有必要让那么完整记录删除?

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

                localDb.Entry(customer).State = EntityState.Deleted;
                localDb.SaveChanges();

任何投入?

Answer 1:

您可以从数据库中读取行,然后将其删除,但这会导致2个往返到数据库。

如果你想这样做的一重击,你有第二个版本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;
}


Answer 2:

如果从数据库中检索对象,然后它已经连接到上下文,这样你可以删除:

db.myTable.Remove(model);


如果你刚刚收到从模型编辑或删除视图通过邮寄或自己产生的,以避免2趟数据库,然后EF不知道这件事,你会得到错误与上述线(在ObjectStateManager .. ..not发现),所以你设置其状态为“已删除”通知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();


Answer 3:

你可以做到这一点?

var customer = localDb.Customers.Single(o => o.CustomerId == id);
localDb.Customers.Remove(customer);
localDb.SaveChanges();


Answer 4:

public T Delete<T>(T obj) where T : class
        {
            T existing = context.Set<T>().Find(GetKeys(obj, context));

            if (existing != null)
            {
                context.Set<T>().Remove(existing);
                context.SaveChanges();
                return existing;
            }
            return null;
        }

private object[] GetKeys<T>(T entity, DbContext context) where T : class
        {
            ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext;
            ObjectSet<T> set = objectContext.CreateObjectSet<T>();
            var keyNames = set.EntitySet.ElementType
                                                        .KeyMembers
                                                        .Select(k => k.Name).ToArray();
            Type type = typeof(T);

            object[] keys = new object[keyNames.Length];
            for (int i = 0; i < keyNames.Length; i++)
            {
                keys[i] = type.GetProperty(keyNames[i]).GetValue(entity, null);
            }
            return keys;
        }


Answer 5:

我知道这个问题是很老,但没有上述工作对我来说,因为我是从一个以上的类/服务立即删除寄存器和他们中的每一个被实例化它自己的数据库连接上下文。

我做了什么来解决它是第一个创建的上下文发送到类/服务要访问数据库,在那里休息。

例如,我的serviceA将要删除一些它的寄存器和呼叫serviceBserviceC做同样与他们的寄存器。

然后我会删除我的寄存器serviceA和作为参数传递的创建上下文serviceAserviceBserviceC



文章来源: The object cannot be deleted because it was not found in the ObjectStateManager in entity framework 5