2016-07-11 10 views
2

新しいアプリケーションを開始します。 Entity Frameworkを使いたい。私たちは誤ってSQLの行を削除することを恐れていません(特に関連データを誤ってセットするなど)。エンティティフレームワーク:グローバルに削除を無効にする

すべての行を "validUntil"列でマークし、行を決して削除しないので、

私はthat it can done by roles in sqlを見ましたが、私はすべてのロジックとコントロールがちょうどコードであることを望みます。

おそらく、Entity Frameworkのコアに、それを有効にする新機能がありますか?私はまだEFで行sqlを書くことができることを知っているが、我々はそのような場合を恐れない。

さらにリラックスできるエンティティリレーションの設定を削除しようとしましたが、EFの通常の機能が壊れてしまい、良いアイデアのようには見えませんでした。

私は上記のリンクでリポジトリパターンの使用を推奨していましたが、hereはそれが良い方法ではないようです。

EFで安全に作業するにはどうすればよいですか?感謝! ありがとう!

答えて

2

ロールオプションは片道ですが、SaveChangesを上書きすることもできます。あなたはすべての関係の削除動作を変更したい場合は

、その後、あなたは(OnModelCreatingでこのコードを使用することができます :

public override int SaveChanges() 
{ 
    foreach (DbEntityEntry entity in this.ChangeTracker.Entries) 
    { 
     if (entity.State == System.Data.EntityState.Deleted) 
      return;   
    } 

    base.SaveChanges(); 
} 

EDIT

私はEF Coreのためのgitで読みます...)を使用して、モデル内のすべての リレーションシップについて一括設定します。

foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys())) 
{ 
    relationship.DeleteBehavior = DeleteBehavior.Restrict; 
} 
+0

動作しません。私は1対多の定期購読でアカウントを持っています。 アカウントID == 13には1つのサブスクリプション(ID == 5)があります。 今、var x = _context.Accounts.Include(b => b.Subscriptions)を設定しました。最初(a => a.AccountId == 13); x.Subscriptions = null; オーバーライドで保存変更状態===削除されたエンティティは存在しませんが、一度saveChanges doneサブスクリプションID == 5がデータベースから削除されました... – arielorvits

+0

EF 6またはEFコアを使用していますか? –

+0

コア。私は厳密に削除カスケードを変更したので、この状況を解決しました – arielorvits

1

ウィリアムの答えはかなりそれを行う方法ですが、あなたはまた、このような何かを行うことができます。

例外をスローするように設定し、DeleteVirtualメソッドを追加します。主にこれも更新され、validUntilフィールドを更新してソフト削除を実行できます。

T IDbContext.Delete<T>(T entity) 
    { 
     throw new NotImplementedException(); 
    } 


    T IDbContext.DeleteVirtual<T>(T entity) 
    { 
     this.Entry(entity).State = EntityState.Modified; 
     return entity; 
    } 
1

あなたはDbContextクラスでSaveChanges()メソッドをオーバーライドすることができ、そこにあなたが削除されたエンティティのリストを取得し、そのStatusUnchangedに変更することができます。

public override int SaveChanges() 
{ 
    var DeletedEntities = ChangeTracker.Entries().Where(E => E.State == EntityState.Deleted).ToList(); 

    DeletedEntities.ForEach(E => 
    { 
     E.State = EntityState.Unchanged; 
    }); 

    return base.SaveChanges(); 
} 
+0

これは動作していません。私は1対多の定期購読でアカウントを持っています。 account id == 13には1つのサブスクリプション(id == 5)があります。今私はvar x = _context.Accounts.Include(b => b。サブスクリプション)。最初(a => a.AccountId == 13);次にx.Subscriptions = null;現在の状態を上書き保存状態==削除されたエンティティは存在しませんが、一度saveChanges doneサブスクリプションID == 5がデータベースから削除されました... – arielorvits

関連する問題