Entity Frameworkコアでの読み取りでデータベース行をロックする

c# entity-framework-core multithreading

質問

EFコアを使用して読み取り時に行をロックする方法はありますか?私はTransactionScopeを使用して簡単な解決策を見つけましたが、動作していないようです(クラスが見つかりません)

問題は、スレッドで行うアイテムを削除して、削除ボタンを2回押すと、アイテムが2回目には存在しないため、例外が発生することです。

私の最初の解決策は、項目がまだ存在するかどうかをチェックすることでしたが、メソッドがタスクとして呼び出されたときに、いずれかのタスクが削除される前に両方のタスクによってチェックが実行されました。だから、私はこの行をロックして、2番目のタスクがエラーを起こさないようにする必要があります。

クイックアンドダーティーな解決策は、もちろん空のキャッチで試してみることになりますが、私はこれをきれいな方法で処理することを好むでしょう。

受け入れられた回答

もう1つの選択肢は、単に削除操作にEFを使用しないことです。

未処理のSQL DELETE TableName WHERE PrimaryKey = @Keyし、レコードがすでに削除されている場合、エラーは発生しません。


ダッパー

    using (var sqlConnection = new System.Data.SqlClient.SqlConnection(Connectionstring))
    {
        sqlConnection.Open();
        string sqlQuery = "DELETE FROM [dbo].[Customer] WHERE CustomerId=@CustomerId";
        sqlConnection.Execute(sqlQuery, new {customerId});
        sqlConnection.Close();

    }

トルトゥーガチェーン

dataSource.DeleteByKey ( "Customer", CustomerId).Execute();

EF

using (var context = new [...]) {

    context.Database.ExecuteSqlCommand("DELETE FROM [dbo].[Customer] WHERE CustomerId=@CustomerId", new SqlParameter("@CustomerId", CustomerId));

}

(そうですが、EF以外のクエリを実行するためにEFを使用するのは無駄ですが、オプションです)。


人気のある回答

私は、外部キー違反、レコードが見つからないなどのさまざまなルーチン条件で例外をトリガできるため、INSERT、UPDATEまたはDELETEを引き起こしているときはいつでも、try / catchでefクエリを保護する必要があると感じています。このような例外は、エラーとして、しかし致命的ではないので、処理する必要があります。あなたの質問は、例外を回避する方法ではなく、あなたに驚かないことを確認することによって解決されます。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ