2016-04-13 21 views
1

kullanarak ChangeConflictException almak Devart.Data.Linq.ChangeConflictException: Row not found or changed aralıklı bir oluşumunu araştırıyorum.* Not * Devre

concurrency conflicts'daki Devart makalesini okudum ve bir başlangıç ​​noktası olarak eşzamanlılık çakışmalarını çoğaltmaya çalışıyorum. Dahil edilen MS tabanlı LINQ sınıflarını kullanarak bunu yapmak kolaydır (aşağıdaki kod yapısı kullanılarak başarılı bir şekilde yapılır). Ancak makaledeki örneklerini takip etmem bile istisna oluşturamıyorum. Aşağıda yeni bağlam LinqConnect kullanma

  • (enjeksiyon bu test sırasında saldırılar endişe değil) gösterilen basitleştirilmiş ADO sorguyu kullanarak kendi makalesinde
  • gösterildiği gibi ben de bir ADO tam sorgu paramaterised kullanma
    • denedi (makalelerinde de belirtilmiştir).
    • Yürütmeyi bir hata ayıklayıcıyla duraklatmak ve MySQL Workbench'i kullanarak tabloyu el ile güncelleştirmek.

    Bu test kodu kullanıyorum edilir:

    public static void MySqlTest() 
    { 
        using (MySqlDataContext db = new MySqlDataContext()) 
        { 
         Customer customer = db.Customers.First(c => c.Username.Equals("ian2")); 
    
         MySqlAdoChange(db.Connection); 
         //MySqlLinqConnectChange(); 
    
         customer.Address1 = "Original change" + DateTime.UtcNow.Ticks; 
         db.SubmitChanges(); 
        } 
    } 
    
    public static void MySqlAdoChange(DbConnection connection) 
    { 
        connection.Open(); 
        var command = connection.CreateCommand(); 
        command.CommandText = "UPDATE customers SET Address1 = 'Conflicting change" + DateTime.UtcNow.Ticks + "' WHERE Username = 'ian2'"; 
        command.ExecuteNonQuery(); 
    } 
    
    public static void MySqlLinqConnectChange() 
    { 
        using (MySqlDataContext db = new MySqlDataContext()) 
        { 
         Customer customer = db.Customers.First(c => c.Username.Equals("ian2")); 
         customer.Address1 = "Conflicting change" + DateTime.UtcNow.Ticks; 
         db.SubmitChanges(); 
        } 
    } 
    

    iki kat-garip olan şu ki ikisi arasında alternatifler veritabanına kaydedildi değer! Benzersizliği sağlamak için DateTime onaylarını sonuna kadar eklemeliydim, aksi halde güncellememi en iyi duruma getiriyordu ve yalnızca şu anda etkin olmayan değer olarak güncelleniyordu.

    Bu davranışı herkes açıklayabilir mi? Neden bir ChangeConflictException üretemiyorum? senin örneğin kodda, sen MySqlTest işlevinde Phone alanı güncelleştirmek, ancak MySqlAdoChange işlevinde Address1 alan, bu nedenle herhangi bir çelişki olamayacağını

  • cevap

    1

    çekeriz. Bununla birlikte, büyük olasılıkla bunu düzeltmiş olsanız bile, yine de güncelleme çakışması yaşamayacaksınız demektir. Customer sınıf kaynak kodunuza bakarsanız, Phone özelliğiyle, (muhtemelen) UpdateCheck = UpdateCheck.Never ile sütun özniteliği ile süslendiğini görürsünüz (bu varsayılan değerdir: burada https://www.devart.com/linqconnect/docs/MemberMapping.html'a bakın). Bu nedenle, varsayılan olarak, UpdateCheck = UpdateCheck.Always veya UpdateCheck.WhenChanged ile süsleyerek hangi alanların denetleneceğini belirtmediğiniz sürece, LinqConnect alanlarınız için güncelleştirme çakışmalarını denetlemez. Elbette, kaynak kodunu doğrudan değiştirmemelisiniz, bunun yerine model tasarımcısında bu özelliği değiştirmelisiniz.

    +0

    Telefon vs Adresinden şüphesiz haklısınız. Aslında Telefon alanında (ki aslında bir metin alanı, ama belli ki böyle değil) test ediyordum, sonra "basitleştirmek" için Adres'i kullanmaya karar verdim ve SO sorusunu doğru şekilde güncellemedim. Önerdiğiniz özniteliğe bakacağım, bilgi için teşekkürler. Bu konuyla ilgilenebileceğiniz başka bir ödül (burada) (http://stackoverflow.com/questions/36586779/devart-changeconflictexception-but-values-still-written-to-database?lq=1) var. sadece büyük problemin bir alt kümesidir. – Ian

    +0

    İki kez noktalandınız, değişkenlerim, 'UpdateCheck = UpdateCheck.Never' özniteliği ile dekore edilen _all_ (ID ID'leri kısıtlama) idi. Ve kaldırarak beklendiği gibi bir istisna oluşturur. Çok teşekkür ederim, bu benim problemimin yarısını çözüyor. Ama şimdi diğer 'ChangeConflictException 'sorunum daha da şaşırtıcı hale getirir. – Ian