我试图从数据库中删除某个项目,
此项目与其他项目有关。 当我试图像这样删除它。
using (var ctx = new UmeaKommunFacilityContext())
{
try
{
ctx.Facility.Attach(oldFacilitiesToDelete[i]);
ctx.Facility.Remove(oldFacilitiesToDelete[i]);
ctx.SaveChanges();
}
catch (Exception e)
{
}
}
然后我
An entity object cannot be referenced by multiple instances of IEntityChangeTracker
我添加了此代码以分离项目
ctx.Entry(oldFacilitiesToDelete[i]).State = EntityState.Detached;
ctx.Facility.Attach(oldFacilitiesToDelete[i]);
ctx.Facility.Remove(oldFacilitiesToDelete[i]);
ctx.SaveChanges();
然后我得到了同样的例外。
然后该怎么做才能从db中删除该项目。 这个项目类型(Facility)与其他类型有关,我已经删除了与此代码相关的所有其他类型,并且它有效
using (var db2 = new UmeaKommunFacilityContext())
{
try
{
Facility f = oldFacilitiesToDelete[i];
List<Image> images = f.Images.ToList<Image>();
for (int j = 0; j < images.Count; j++)
{
db.Images.Attach(images[i]);
db.Images.Remove(images[i]);
db.Entry(images[i]).State = EntityState.Detached;
}
List<Material> materials = f.Materials;
for (int j = 0; j < materials.Count; j++)
{
db.Materials.Attach(materials[i]);
db.Materials.Remove(materials[i]);
db.Entry(materials[i]).State = EntityState.Detached;
}
List<Polygon> polygons = f.Polygons;
for (int j = 0; j < polygons.Count; j++)
{
db.Polygons.Attach(polygons[i]);
db.Polygons.Remove(polygons[i]);
db.Entry(polygons[i]).State = EntityState.Detached;
}
db.SaveChanges();
}
catch (EntityException ex)
{
}
catch (Exception e)
{ }
}
答案 0 :(得分:0)
为什么你在同一个项目上执行Attach()
和Remove()
?
要从数据库中删除项目,您需要使用“删除”操作。例如:
ctx.Entry(oldFacilitiesToDelete[i]).State = EntityState.Deleted;
ctx.SaveChanges();
当你&#34;分离&#34;您只是从上下文中删除它,而不是从数据库中删除它。这就是为什么你总是可以用#34;附加&#34;。
如果这里的要点是删除项目的相关实体,那么它更容易实现.OnCascadeDelete(true)所以你只能删除主实体; EF将为您删除其他相关项目,如下所示:
HasRequired(t => t.MainEntity)
.WithMany(t => t.SubEntity)
.HasForeignKey(d => d.MainEntityId)
.WillCascadeOnDelete(true);