2016-03-22 4 views
1

DbConextを通過してSaveChangesを呼び出す代わりに、汎用リポジトリに新しいメソッドを追加してデータベースから直接レコードを削除します。Execute拡張機能はDbUpdateExceptionをスローしますか?

だから私はやった:DbContextハンドルDbUpdateExceptionを使用してエンティティを削除し、この例外がクライアントにバブルアップ

public virtual void Delete(int id) 
    { 
     var connection = dataContext.GetDatabase().Connection; 
     var query = string.Format("DELETE FROM {0} WHERE id = {1}", tableName, id); 

     connection.Execute(query); 
    } 

私の現在のコードを。

DapperのExecute拡張機能もこの例外をスローしますか?

答えて

1
  1. これはありません。必要ならば、ExecuteScalar<int>を使用してdeleteの後にselect @@rowcountのようなものを実行し、返された番号が1であることを確認する必要があります。あなたは、タイムスタンプのチェックをしたい場合は、SQLのデータ部分にそのwhere句のパラメータとして

  2. 決して、決して、決して CONCATENATE入力が含まれます。 SQLインジェクションのリスクが発生し、すべてのクエリ/オペレーションキャッシュが破壊されます。最初の理由は必要なものです。テーブル名のようなものの周りには注意書きがありますが、そこにホワイトリストに載るべきです。なお、Dapperのは、完全なパラメータ化(!簡単なパラメータ処理がそれを使用する主な理由の一つです)をサポートしてい

たとえば、私が何かやっているでしょう。また

public YourType(string tableName) { // constructor 
    WhiteList.AssertValid(tableName); // throws if not allowed 
    deleteCommand = $"DELETE FROM [{tableName}] WHERE id = @id; SELECT @@ROWCOUNT;"; 
} 
private readonly string deleteCommand; 
public virtual void Delete(int id) 
{ 
    var connection = dataContext.GetDatabase().Connection; 
    int count = connection.ExecuteScalar<int>(deleteCommand, new { id }); 
    if(count != 0) throw new DbUpdateException(); 
} 

を、アドオンを使用しますあなたのためにこれらすべてのことをするdapper-contribのようなツールで。

0

私は、これは実際の質問への答えではありません知っているが、私見、あなたは

Finding the reason for DbUpdateException

のためにその道を行く必要があり、あなたは、Executeメソッドをオーバーライドする根本的な原因を取得し、良いのためにそれを解決することができます。

+0

私のシナリオでは、db adminが "無意識のうちに" db(例えば、外部キー、追加/変更列など)の何かを変更することがあります。したがって、問題を特定して解決できるように例外をキャッチする必要があります。 –

関連する問題