私は使用ADO.NET EF
していますが、メソッドに何らかのカスタムロールバックを実装する必要がありますSave()
。ロジックはこれ
- が呼び出され
OpenFileDialog
たときの最初のステップSave()
は、選択した画像があるかどうか、選択した画像を新しい場所にコピーする必要があるかどうかを確認することです。 - 次に、画像名を含むエンティティのプロパティを設定し (これが最初に画像をコピーすることを選択した理由です)、このメソッドで一意の値の重複がないかどうかを確認します。
HasDuplicatingEntity(entity)
- コピー プロセスがうまくいき、同じ一意の値を持つエンティティがない場合は、エンティティ自体を保存します。
Save(entity)
- 何か問題が発生した場合
Save(entity)
は、以前にコピーしたイメージ (存在する場合) を削除するだけで済みます。
実際の実装は次のようなものです。
try
{
SaveImage();
if(HasDuplicatingEntity(entity))
{
//Show message to the user
return false;
}
Save(entity);
}
catch
{
//Log the exception and show message
//Delete the image if there is such
}
発生する問題は、選択した画像で新しいエンティティを保存しようとするとHasDuplicatingEntity(entity)
true が返されることです。次に、現在のロジックを使用して、同じ一意の値を持つエンティティが既に存在することをユーザーに示し、false を返すだけです。これにより、イメージが選択されてコピーされた場合、ファイル システムに未使用のイメージが残ります。 .
それが私の正確な質問につながります。問題が発生した場合に画像を削除するためのメソッドがありますが、catch
句で呼び出されます。画像を削除する必要がある別の場所があることがわかった場合、次の 2 つのオプションが表示されます - 内からメソッドを呼び出すだけif
です。
if(HasDuplicatingEntity(entity))
{
//Show message to the user
//Delete Image
return false;
}
これはちょっと論理的ですが、メソッド呼び出しを除いて、実際にコピーされた画像があるかどうかを確認するためにいくつかのチェックがあります。画像は必要なく、数行の繰り返しコードになるからです。もう 1 つのオプションは、例外をスローしてcatch
、この問題を既に処理している節に移動することですが、これは、この状況を管理する現在の方法を変更することを意味します。この正確な部分:
if(HasDuplicatingEntity(entity))
{
//Show message to the user
return false;
}
は継承されており、経験があまりないので、良いものを悪いものに変えたくないので、この問題に対処する正しい方法を知りたい.