0

に関連付けられたモデルがいくつかありDbContextます。SaveChanges保存されているモデルに基づいて別のことを行うためにオーバーライドするにはどうすればよいですか?

たとえば、2つのモデルがあるDocumentとしParagraphます。SaveChangesaが追加されたときにディレクトリが作成され、aDocumentが追加されたときにファイルが作成されるようにオーバーライドするにはどうすればよいですかParagraph

これがこれまでの私の試みです。

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

    var context = ((IObjectContextAdapter)this).ObjectContext;
    var stateEntries = context.ObjectStateManager.GetObjectStateEntries(
        EntityState.Added
        | EntityState.Modified
        | EntityState.Deleted
    ).ToList();

    foreach (var entry in stateEntries)
    {
        if (!entry.IsRelationship)
        {
            switch (entry.State)
            {
                case EntityState.Added:
                    break;

                case EntityState.Modified:
                    break;

                case EntityState.Deleted:
                    break;
            }
        }
    }

    return base.SaveChanges();
}
4

1 に答える 1

2

エントリにはEntity、処理されたエンティティのインスタンスを保持するプロパティがあるため、インスタンスのタイプを確認し、理論的には必要なロジックを実行できます。


データベースへの永続化のためにエンティティを処理する以外の目的で使用SaveChangesしないでください。これにより、関心の分離が損なわれます。コンテキストは、アプリケーション ロジックとデータベースの間のアダプターであり、それ以上のものではありません。さらに、ファイルシステム操作をデータベース操作と統合するというこの考え全体は、操作が失敗した場合の状況を解決するために、はるかに複雑で慎重な処理を必要とします。現在のシナリオでは、への呼び出しに失敗するとbase.SaveChanges、ファイル システムに孤立したディレクトリまたはファイルが作成されます。トランザクション ファイル システムを使用してデータベースとファイル システムの操作を同じトランザクションで実行するか、ファイル システムの手動補正を実装する必要があります。

コードのもう 1 つの問題は、ファイルなどを挿入する前にディレクトリが作成されていることを確認するDocument前にインスタンスを処理する必要があるParagraphことです。単純に、このロジックはメソッドに属しておらず、SaveChangesメソッドから呼び出されるべきではありませんSaveChanges

于 2012-04-09T22:32:00.557 に答える