Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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

public class Parent {     public int Id { get; set; }     public string Name { get; set; }     public ICollection<Child> Children { get; set; } }  public class Child {     public int Id { get; set; }     public string ChildName { get; set; } } 

What I want to do is clear Parent.Children and remove related child entities from database. I've already tried:

Database context class:

modelBuilder.Entity<Parent>()             .HasMany(p => p.Children)             .WithOptional()             .WillCascadeOnDelete(true); 

this works fine, but I still have redundant records in database with Parent_Id = null fields when I do

parent.Children.Clear(); repository.InsertOrUpdate(parent); 

in my repository class. Also the same behavior is when I do:

modelBuilder.Entity<Parent>()             .HasMany(pr => pr.Children)             .WithOptional(ri => ri.Parent)             .WillCascadeOnDelete(true); 

with additional Parent property in Child class

public class Child {     ...     public Parent Parent { get; set; }     ... } 

or when I do

modelBuilder.Entity<Child>()             .HasOptional(p => p.Parent)             .WithMany(p => p.Children)             .HasForeignKey(p => p.Parent_Id)             .WillCascadeOnDelete(true); 

with additional Parent_Id property in Child class

public class Child {      ...      public int Parent_Id { get; set; }      ... } 

So, how can I configure cascade deleting correctly? Or how should I supposed to remove those child entities? I assume this is casual task but I'm just missing something.

like image 871
Dmytro Avatar asked May 20 '13 17:05

Dmytro


People also ask

How do I delete EF records?

Delete a Record In Connected Scenario, you can use the Remove or RemoveRange method to mark the record as Deleted . In Disconnected Scenario, you can attach it to the context and set its state as Deleted . Calling SaveChanges will send the delete query to the database.


1 Answers

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

 context.Children.RemoveRange(parent.Children) 
like image 121
Sam Sippe Avatar answered Oct 09 '22 12:10

Sam Sippe