How to remove child one to many related records in EF code first database?

后端 未结 5 1948
逝去的感伤
逝去的感伤 2020-12-01 00:57

Well, I have one-to-many related model:

public class Parent
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<         


        
相关标签:
5条回答
  • 2020-12-01 01:04

    In EF6 a faster way to do the operation is...

     context.Children.RemoveRange(parent.Children)
    
    0 讨论(0)
  • 2020-12-01 01:09

    This is called "deleting orphans".

    Can EF automatically delete data that is orphaned, where the parent is not deleted?

    I don't know how it works in EF6 but in EF Core it works fine https://docs.microsoft.com/en-us/ef/core/saving/cascade-delete so you don't necessarily need to delete the parent for cascades to work.

    Delete orphans examples

    0 讨论(0)
  • 2020-12-01 01:10

    Cascading delete has no effect here because you don't delete the parent but just call InsertOrUpdate. The correct procedure is to delete the children one-by-one, like so for example:

    using (var context = new MyContext())
    {
        var parent = context.Parents.Include(p => p.Children)
            .SingleOrDefault(p => p.Id == parentId);
    
        foreach (var child in parent.Children.ToList())
            context.Children.Remove(child);
    
        context.SaveChanges();
    }
    
    0 讨论(0)
  • 2020-12-01 01:11

    Try changing to

     public virtual ICollection<Child> Children { get; set; }
    

    because virtual is needed to get lazy loading. as explained here

    I think your parent.Children.clear isnt working because the Children have not been loaded

    0 讨论(0)
  • 2020-12-01 01:22

    If your object is self-referencing, you can delete both many-to-many and one-to-many children using the method below. Just remember to call db.SaveChanges() afterwards :)

    [HttpPost, ActionName("Delete")]
    [ValidateAntiForgeryToken]
    public ActionResult DeleteConfirmed(int id)
    {
        Object obj = this.db.Objects.Find(id);
        this.DeleteObjectAndChildren(obj);
        this.db.Objects.Remove(obj);
        this.db.SaveChanges();
        return this.Json(new { success = true });
    }
    
    /// <summary>
    /// This deletes an object and all children, but does not commit changes to the db.
    ///  - MH @ 2016/08/15 14:42
    /// </summary>
    /// <param name="parent">
    /// The object.
    /// </param>
    private void DeleteObjectAndChildren(Object parent)
    {
        // Deletes One-to-Many Children
        if (parent.Things != null && parent.Things.Count > 0)
        {
            this.db.Things.RemoveRange(parent.Things);
        }
    
        // Deletes Self Referenced Children
        if (parent.Children != null && parent.Children.Count > 0)
        {
            foreach (var child in parent.Children)
            {
                this.DeleteObjectAndChildren(child);
            }
    
            this.db.Objects.RemoveRange(parent.Children);
        }
    }
    
    0 讨论(0)
提交回复
热议问题