Aracılığıyla paylaş


Nasıl yapılır: Veritabanı Değerleri ile Birleştirerek Ç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ğerlerini geçerli istemci üye değerleriyle birleştirmek için kullanabilirsiniz KeepChanges . 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 Bölüm 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, veritabanı değerlerini geçerli istemci üye değerleriyle birleştirerek bu çakışmayı çözmeye karar verir. Sonuç, veritabanı değerlerinin üzerine yalnızca geçerli değişiklik kümesi de bu değeri değiştirdiğinde yazılır.

User1 kullanarak KeepChangesç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)
Mary

(Kullanıcı2'den)
Pazarlama

(Kullanıcı1'den)

Aşağıdaki örnekte veritabanı değerlerinin geçerli istemci üye değerleriyle nasıl birleştirildiği gösterilmektedir (istemci bu değeri değiştirmediği sürece). 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);
    // Automerge database values for members that client
    // has not modified.
    foreach (ObjectChangeConflict occ in db.ChangeConflicts)
    {
        occ.Resolve(RefreshMode.KeepChanges);
    }
}

// Submit succeeds on second try.
db.SubmitChanges(ConflictMode.FailOnFirstConflict);
Try
    db.SubmitChanges(ConflictMode.ContinueOnConflict)

Catch ex As ChangeConflictException
    Console.WriteLine(ex.Message)

    For Each occ As ObjectChangeConflict In db.ChangeConflicts
        ' Automerge database values into current for members
        ' that client has not modified.
        occ.Resolve(Data.Linq.RefreshMode.KeepChanges)
    Next

End Try

' Submit succeeds on second try.
db.SubmitChanges(ConflictMode.FailOnFirstConflict)

Ayrıca bkz.