etkilenen satırlar için eqivalent Onay iş akışında hatırlatma e-postalarının tam olarak bir kez gönderilmesini sağlamak istiyorum.EF SqlCommand.ExecuteNonQuery
SqlCommand.ExecuteNonQuery ile dönüş değerini test ederek bunu sağlayabilir. EF kullanarak önerilen çözüm nedir? ObjectContext.SaveChanges belgelerine göre eşdeğer bir değer döndürmez.
SqlCommand örnek: (TransactionScope durumda SendMail başarısız DB güncellemesini geri almak için kullanılır.)
Dim sql = "UPDATE LeaveApprovalRequests SET State = 'Reminded'" &
" WHERE ID=3 AND State <>'Reminded'"
Using scope As New TransactionScope
Using cnx As New SqlConnection(My.Settings.connectionString)
cnx.Open()
Dim cmd As New SqlCommand(sql, cnx)
If 1 = cmd.ExecuteNonQuery Then
SendMail()
End If
scope.Complete()
End Using
End Using
(bir rowversion mülkiyet Sabit = ConcurrencyMode kullanarak) iyimser eşzamanlılık etkinleştirme ve OptimisticConcurrencyException I yakalayarak Nesnenin gerçekten mağazada güncellenip güncellenmediğini belirleyebilirim. Artık TransactionScope (SendMail başarısız olursa DB güncellemesini geri almak için kullanılır) bir kilitlenme hatası atar. Neden?
Using scope As New TransactionScope
Using ctx As New ApprovalEntities
Try
Dim approval = ctx.LeaveApprovalRequests.
Where(Function(r) r.ID = 3 And r.State = "Created"
).FirstOrDefault
If approval Is Nothing Then
Console.WriteLine("not found")
Exit Sub
End If
Threading.Thread.Sleep(4000)
approval.State = "Reminded"
ctx.SaveChanges()
SendMail()
Catch ex As OptimisticConcurrencyException
Exit Try
End Try
End Using
scope.Complete()
End Using
Bana göre bu belge, SaveChanges'in güncellemeyi amaçladığı nesnelerin sayısını döndürerek depoda güncellenen sayıyı döndürmediğini söylüyor. Bunu, SaveChanges() öğesinde bir kesme noktası ayarlayarak, SQL Server'daki değeri değiştirerek ve ardından devam ederek doğruladım. –
Tam olarak. Ve herhangi bir istisna olmaksızın SaveChanges() * 'ı çağırabilirseniz, EF güncellemeyi amaçlayan nesne sayısının aslında mağazada güncelleneceğini veya bir istisna elde edeceğinizi garanti eder. –
Maalesef, ilk yorumun doğru bir şekilde okunmamış (önemli kısmı hükmüne rağmen). İlk test vakam iyimser bir eşzamanlılık kullanmadı, ama gerçek dünya senaryolarımda çoğu durumda bunu mümkün kılacağım. Bu, TransactionScope'un neden attığı bir kilitlenme hatası verdi sorusunu bırakır. –