实体框架.net
本文关键字:net 框架 实体 | 更新日期: 2023-09-27 18:06:01
我是EF的新手,试图从父Person表和2个子表中删除一个条目;名称和地址…(级联)。当我附加到上下文时,我得到;一个实体对象不能被多个IEntityChangeTracker实例引用。当我删除Attach方法时,我得到;无法删除对象,因为在ObjectStateManager错误中没有找到该对象。谢谢你的建议,因为我出去了。
using (var context = new PersonEntities())
{
ObjectContext oc = ((IObjectContextAdapter)context).ObjectContext;
Email[] DeleteName = SelectedEntries[CurName].Names.ToArray();
Phone[] DeletePhone = SelectedEntries[CurAddress].Addresses.ToArray();
foreach (name name in DeleteName)
{
foreach(Address address in DeleteAddress)
{
foreach (Person person in SelectedEntries)
{
context.Names.Attach(name);
oc.DeleteObject(name);
context.Addresses.Attach(address);
oc.DeleteObject(address);
context.Persons.Attach(person);
oc.DeleteObject(person);
oc.ObjectStateManager.ChangeObjectState(name,
System.Data.EntityState.Deleted);
oc.ObjectStateManager.ChangeObjectState(address,
System.Data.EntityState.Deleted);
oc.ObjectStateManager.ChangeObjectState(person,
System.Data.EntityState.Deleted);
}
}
}
在我看来,DeleteAddress是在不同的上下文中创建的。
你应该在同一个using块中得到DeleteAddress。否则,您将它放在另一个上下文中,然后您也试图将它附加到此上下文中以删除它,这解释了错误。
从同一上下文中获取和删除。
您有两个数据库上下文副本。第二个是代码示例中的那个。第一个是我们看不见但知道存在的,因为你得到的误差。它是用于生成SelectedEntities的上下文。每次调用new PersonEntities时,你都会得到一个单独的上下文,它跟踪所有对象的状态。你得到的第一个错误说databaseContext1拥有那些对象。你不能把它们给databaseContext2。这是为了保持一致性而避免的。第二个错误发生是因为databaseContext2不知道您试图删除的对象。您需要使用相同的PersonEntities来删除您用来从数据库中获取它们的对象。
你的实体是在objectcontext之前的删除?,如果没有,则需要附加实体,例如:
对于框架4.0:
EntityKey ekProducto = new EntityKey("DbCursoEntity.Productos", "Id", producto.Id);
using (dbCurso = new DbCursoEntity())
{
producto.EntityKey = ekProducto; //Añado la key a la entidad.
dbCurso.Productos.Attach(producto); //Enlanzo la entidad al ObjectSet mediante Attach.
dbCurso.Productos.DeleteObject(producto); //Elimino la entidad.
if (dbCurso.SaveChanges() > 0)
return true;
else
return false;
}
老框架:
EntityKey ekProducto = new EntityKey("DbCursoEntity.Productos", "Id", producto.Id);
using (dbCurso = new DbCursoEntity())
{
producto.EntityKey = ekProducto; //Añado la key a la entidad.
dbCurso.Attach(producto); //Enlanzo la entidad mediante Attach.
dbCurso.DeleteObject(producto); //Elimino la entidad.
if (dbCurso.SaveChanges() > 0)
return true;
else
return false;
}
在这个例子中,我的实体不在上下文中,为了添加上下文,我需要添加一个带有id的entitykey。