删除实体框架CF中的相关项

时间:2016-03-18 07:59:13

标签: c# entity-framework ef-code-first

我试图从数据库中删除某个项目,

此项目与其他项目有关。 当我试图像这样删除它。

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)
                    {  }

                }

1 个答案:

答案 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);