[英]Entity Framework .Net
我是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。 否则,您将其放置在另一个上下文中,那么您还尝试将其附加到此上下文中以将其删除,这将解释错误。
从相同的上下文中进行获取和删除。
您的实体在删除之前是否在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的实体键。
您有数据库上下文的两个副本。 第二个是您的代码示例中的一个。 第一个是我们看不到但由于存在错误而知道存在的一个。 它是用于生成SelectedEntities的上下文。 每次调用新的PersonEntities时,您都会获得一个单独的上下文,该上下文跟踪其所有对象的状态。 您得到的第一个错误是databaseContext1拥有这些对象。 您不能将它们提供给databaseContext2。 为了一致性,这被阻止。 发生第二个错误是因为databaseContext2不知道您要删除的对象。 您需要使用相同的PersonEntities删除用于从数据库中获取对象的对象。
如果不清楚,请发布用于原始获取数据库对象的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.