2016-03-26 6 views
-1

Ich versuche zu verstehen, warum Entity Framework funktioniert so wie es mit dem Löschen von untergeordneten Entitäten tut!Versuchen zu verstehen, Löschen untergeordneten Entitäten in Entity Framework

Ich habe ein YogaSpace Objekt/Entität und eine untergeordnete Entität namens YogaSpaceImage. Ich möchte eine YogaSpaceImage von YogaSpace löschen, also hier ist was ich mache.

Diese DOES NOT Arbeit

yogaSpace.Images.Remove(yogaSpaceImage); 

ein Kind Entität zu löschen!

public string RemoveImage(int id, int imageIdToDelete) 
{ 
     YogaSpace yogaSpace = _yogaSpaceRepository.Find(id); 

     // delete image 
     foreach (YogaSpaceImage yogaSpaceImage in yogaSpace.Images.OrderBy(m => m.Ordering)) 
     { 
      if (yogaSpaceImage.YogaSpaceImageId == imageIdToDelete) 
      { 
       // check first to see if the deleted image is the first (primary) image, then make the 2nd image the yogaspace thumbnail 
       if (yogaSpaceImage.Ordering == 1) 
       { 
        yogaSpace.SpaceThumbnail = yogaSpace.Images.First(m => m.Ordering == 2).ImageThumbnail; 
       } 
       yogaSpace.Images.Remove(yogaSpaceImage); 
      } 
     } 
    } 

    myRepository.InsertOrUpdate(YogaSpace); 
    myRepository.Save() 
} 

Diese tut Arbeit, wenn ich myRepo.Removed(YogaSpaceImage) nennen.

public string RemoveImage(int id, int imageIdToDelete) 
{ 
     YogaSpace yogaSpace = _yogaSpaceRepository.Find(id); 

     // delete image 
     foreach (YogaSpaceImage yogaSpaceImage in yogaSpace.Images.OrderBy(m => m.Ordering)) 
     { 
      if (yogaSpaceImage.YogaSpaceImageId == imageIdToDelete) 
      { 
       // check first to see if the deleted image is the first (primary) image, then make the 2nd image the yogaspace thumbnail 
       if (yogaSpaceImage.Ordering == 1) 
       { 
        yogaSpace.SpaceThumbnail = yogaSpace.Images.First(m => m.Ordering == 2).ImageThumbnail; 
       } 

       _yogaSpaceRepository.Removed(yogaSpaceImage); 
      } 
     } 
    } 

    myRepository.Save() 
} 

Hier ist, was Removed() und InsertOrUpdate() aus wie in meinem Repo.

public void InsertOrUpdate(YogaSpace yogaSpace) 
{ 
     if (yogaSpace.YogaSpaceId == default(int)) 
     { 
      context.Entry(yogaSpace).State = System.Data.Entity.EntityState.Added; 
     } 
     else 
     { 
      context.Entry(yogaSpace).State = System.Data.Entity.EntityState.Modified; 
     } 
} 

public void Removed(YogaSpaceImage yogaSpaceImage) 
{ 
     context.Entry(yogaSpaceImage).State = EntityState.Deleted; 
} 

P.S. Sie würden denken, InsetOrUpdate() in meinem Repo würde für EntityState.Modified arbeiten, um eine Kind-Entität zu entfernen?

P.P.S. nicht sicher, warum ich sogar InsertOrUpdate() brauche, wurde es mit dem automatisch erzeugten nugget-Paket gebaut. Wenn ich es nicht verwende und einfach Save() anrufe, versteht Entity Framework die Änderungen, die ich gemacht habe, also warum zum Teufel ist es für mich generiert und warum entity.Added und entity.Modified sogar existiert, weil Entitäten gespeichert und geändert werden, selbst wenn ich nicht 't ruft diese zwei explizit an?

+0

Mögliche Duplikat [? Wie Kind Code ein zu vielen Datensätzen in EF erste Datenbank entfernen] (http://stackoverflow.com/questions/16654828/How-to-remove-Kind-Eins-zu-viele-bezogene-Datensätze-in-ef-Code-erste-Datenbank) –

Antwort

2

Ein netter kleiner Trick ist die Eltern-ID in dem Primärschlüssel des Kindes zu verwenden:

public class Parent 
{ 
    public int Id { get; set; } 

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

public class Child 
{ 
    public int Id { get; set; } 

    public int ParentId { get; set;} 
} 

und die Konfiguration:

modelBuilder.Entity<Parent>() 
      .HasMany(x => x.Children) 
      .WithRequired() 
      .HasForeignKey(x => x.ParentId); 

modelBuilder.Entity<Child>() 
      .HasKey(x => new { x.Id, x.ParentId}) 
      .Property(x => x.Id) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

diese Weise, wenn Sie ein Kind von dem Elternteil entfernen, die ParentId darf nicht leer sein und EF markiert das Kind zum Löschen.

Beispiel, wie man hinzufügen/entfernen Kind parent:

using(var db = new DbContext()) 
{ 
    var p = db.Parents.First(); 
    var c = new Child(); 
    p.Children.Add(c); 
    db.SaveChanges(); // Child was saved to the database 

    p.Children.Remove(c); 
    db.SaveChanges(); // Child will be deleted from the database 

    p.Children.Clear(); 
    db.SaveChanges(); // All Child of this parent will be deleted 
} 
+0

gibt es eine Möglichkeit, dies mit Attributen zu tun? Ich verwende Ihr System nicht (ich kann mich nicht an den Namen erinnern), um Beziehungen und Schlüssel zu definieren. Nur eine Randnotiz, ich habe eine Referenz-ID zu der übergeordneten Entität. Ich definiere es in meinem Objekt wie [Index] public int YogaSpaceRefId {get; einstellen; } [ForeignKey ("YogaSpaceRefId")] Öffentlicher virtueller YogaSpace YogaSpace {get; einstellen; } und öffentliche virtuelle ICollection Images {get; einstellen; } – user1186050

Verwandte Themen