0

1つ以上のリレーションシップを持つカテゴリと商品のエンティティがあり、カテゴリを削除すると、そのカテゴリに属する​​すべての商品を削除したいとします。私は実際にそれを削除したくないので、削除することによって、IsDeletedフラグをtrueに設定することを意味します(削除カスケードで指定することで可能です)。カテゴリが削除されたときにIsDeletedをtrueに設定する方法を見つけましたが、そのカテゴリの商品を見つけて同じことをする方法を見つけることができません。どんな助け?EFコアの1対多のリレーションシップをソフトに削除する方法は?

public override int SaveChanges() 
    { 
     ChangeTracker.DetectChanges(); 

     foreach(var item in ChangeTracker.Entries<Category>().Where(e => e.State == EntityState.Deleted)) 
     {  
      item.State = EntityState.Modified; 
      item.CurrentValues["IsDeleted"] = true; 
     } 

     return base.SaveChanges(); 
    } 

私が削除されたアイテム

builder.Entity<Category>().Property<bool>("IsDeleted"); 
    builder.HasQueryFilter(c => !EF.Property<bool>(c, "IsDeleted")); 
+0

カテゴリエンティティには、そのカテゴリに属している製品のリストが表示されます。 –

答えて

0

ただ、カスケード削除に使用を取得しないように、私はまた、クエリフィルタを指定。カテゴリを削除すると、そのカテゴリのすべての商品はナビゲーションプロパティに基づいて削除済みとしてマークされます。これはEFCore自体によって行われます。私は自分のコードでこのaproachを使って、1対多の関係をソフトに削除しています。それで、あなたのコードが製品に繰り返されるようにしてください:

public override int SaveChanges() 
{ 
    ChangeTracker.DetectChanges(); 

    foreach(var item in ChangeTracker.Entries<Category>().Where(e => e.State 
    == EntityState.Deleted)) 
    {  
     item.State = EntityState.Modified; 
     item.CurrentValues["IsDeleted"] = true; 
    } 

    foreach(var item in ChangeTracker.Entries<Product>().Where(e => e.State 
    == EntityState.Deleted)) 
    {  
     item.State = EntityState.Modified; 
     item.CurrentValues["IsDeleted"] = true; 
    } 

    return base.SaveChanges(); 
} 
+0

私はこのアプローチを試みましたが、それは私のためには機能しません。 – RooT

関連する問題