2016-03-26 15 views
-1

Entity Frameworkが子エンティティの削除と同じように機能する理由を理解しようとしています。Entity Frameworkの子エンティティの削除を理解しようとしています

私は、YogaSpaceのオブジェクト/エンティティと、YogaSpaceImageという子エンティティを持っています。 YogaSpaceからYogaSpaceImageを削除したいので、ここで私がしていることです。

このは、子エンティティを削除しない仕事

yogaSpace.Images.Remove(yogaSpaceImage); 

を行います!私はmyRepo.Removed(YogaSpaceImage)を呼び出すときに、この

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

作業を行います。ここで

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

は私のレポでどのように見えるかRemoved()InsertOrUpdate()です。

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.あなたは私のレポのInsetOrUpdate()EntityState.Modifiedの子エンティティを削除するために働くと思いますか?

P.P.S.なぜ私はさらにInsertOrUpdate()が必要なのか分からないが、それは自動生成されたナゲットパッケージで構築された。私がそれを使用せずにSave()と呼んだら、エンティティフレームワークは私が行った変更を理解しています。なぜなら、なぜ私が生成したのはなぜentity.Addedentity.Modifiedなのでしょうか?明示的にこれら2つを呼び出すのではないか?

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;} 
} 

と設定:

+0

可能な複製(http://stackoverflow.com/questions/16654828/e-code-first-databaseのfirst-databaseのレコードを削除する方法) –

答えて

2

素敵な小さなトリックは、子の基本キーに親のIDを使用することです

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

あなたが親から子を削除するこの方法では、 ParentIdは空にすることはできず、EFは子に削除をマークします。

例どのように親に子を追加/削除する方法:[?EFコード最初のデータベースに多くの関連レコードに子1を削除する方法]の

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

属性を使ってこれを行う方法はありますか?関係や鍵を定義するためにあなたのシステムを使用しているわけではありません。ちょっとしたことに、私は親エンティティへの参照IDを持っています。私は[Index]のようにオブジェクトに定義します。 public int YogaSpaceRefId {get;セット; } [ForeignKey( "YogaSpaceRefId")] public virtual YogaSpaceヨガスペース{get;セット; }およびパブリック仮想ICollection イメージ{get;セット; } – user1186050

関連する問題