Nasıl yapılır: Veritabanı Değerlerinin Üzerine Yazarak Çakışmaları Çözümleme
Değişikliklerinizi yeniden göndermeye çalışmadan önce beklenen ve gerçek veritabanı değerleri arasındaki farkları mutabık hale getirmek için, veritabanı değerlerinin üzerine yazmak için kullanabilirsiniz KeepCurrentValues . Daha fazla bilgi için bkz . İyimser Eşzamanlılık: Genel Bakış.
Not
Her durumda, istemcideki kayıt önce veritabanından güncelleştirilmiş veriler alınarak yenilenir. Bu eylem, sonraki güncelleştirme denemesinin aynı eşzamanlılık denetimlerinde başarısız olmamasını sağlar.
Örnek
Bu senaryoda, User1 değişiklikleri göndermeye çalıştığında bir ChangeConflictException özel durum oluşur çünkü Kullanıcı2 bu sırada Yardımcı ve Departman sütunlarını değiştirmiştir. Aşağıdaki tabloda durum gösterilmektedir.
Durum | Yönetici | Yardımcı | Bölüm |
---|---|---|---|
User1 ve User2 tarafından sorgulandığında özgün veritabanı durumu. | Alfreds | Maria | Sales |
User1 bu değişiklikleri göndermeye hazırlanır. | Alfred | Pazarlama | |
User2 bu değişiklikleri zaten gönderdi. | Mary | Hizmet |
Kullanıcı1, geçerli istemci üye değerleriyle veritabanı değerlerinin üzerine yazarak bu çakışmayı çözmeye karar verir.
User1 kullanarak KeepCurrentValuesçakışmayı çözdiğinde, veritabanındaki sonuç aşağıdaki tabloda gösterildiği gibidir:
Durum | Yönetici | Yardımcı | Bölüm |
---|---|---|---|
Çakışma çözümü sonrası yeni durum. | Alfred (Kullanıcı1'den) |
Maria (özgün) |
Pazarlama (Kullanıcı1'den) |
Aşağıdaki örnek kod, veritabanı değerlerinin geçerli istemci üye değerleriyle nasıl üzerine yazılmasını gösterir. (Tek tek üye çakışmalarının incelenmesi veya özel işlenmesi gerçekleşmez.)
try
{
db.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException e)
{
Console.WriteLine(e.Message);
foreach (ObjectChangeConflict occ in db.ChangeConflicts)
{
//No database values are merged into current.
occ.Resolve(RefreshMode.KeepCurrentValues);
}
}
Try
db.SubmitChanges(ConflictMode.ContinueOnConflict)
Catch ex As ChangeConflictException
Console.WriteLine(ex.Message)
For Each occ As ObjectChangeConflict In db.ChangeConflicts
' No database values are merged into current.
occ.Resolve(Data.Linq.RefreshMode.KeepCurrentValues)
Next
End Try