Bir LINQ to SQL bağlantısıyla (SQL Server Compact Edition'a karşı) bir çift özelliği güncelledikten sonra DataContext'e SubmitChanges'ı çalıştırırken "Satır bulunamadı veya değiştirildi" mesajı alıyorum. ChangeConflictException.
var ctx = new Data.MobileServerDataDataContext(Common.DatabasePath);
var deviceSessionRecord = ctx.Sessions.First(sess => sess.SessionRecId == args.DeviceSessionId);
deviceSessionRecord.IsActive = false;
deviceSessionRecord.Disconnected = DateTime.Now;
ctx.SubmitChanges();
Sorgu aşağıdaki SQL'i oluşturur:
UPDATE [Sessions]
SET [Is_Active] = @p0, [Disconnected] = @p1
WHERE 0 = 1
-- @p0: Input Boolean (Size = 0; Prec = 0; Scale = 0) [False]
-- @p1: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:12:02 PM]
-- Context: SqlProvider(SqlCE) Model: AttributedMetaModel Build: 3.5.21022.8
Bariz sorun, WHERE 0 = 1'dir . Kayıt yüklendikten sonra, "deviceSessionRecord" daki tüm özelliklerin birincil anahtarı içerecek şekilde doğru olduğunu onayladım. Ayrıca, "ChangeConflictException" öğesini yakalarken bunun neden başarısız olduğu hakkında ek bilgi yoktur. Ayrıca, bu istisnanın veritabanında tam olarak bir kayıtla (güncellemeye çalıştığım kayıt) atıldığını da onayladım.
Garip olan, kodun farklı bir bölümünde çok benzer bir güncelleme ifadesine sahip olmam ve aşağıdaki SQL'i oluşturması ve gerçekten de SQL Server Compact Edition veritabanımı güncellemesi.
UPDATE [Sessions]
SET [Is_Active] = @p4, [Disconnected] = @p5
WHERE ([Session_RecId] = @p0) AND ([App_RecId] = @p1) AND ([Is_Active] = 1) AND ([Established] = @p2) AND ([Disconnected] IS NULL) AND ([Member_Id] IS NULL) AND ([Company_Id] IS NULL) AND ([Site] IS NULL) AND (NOT ([Is_Device] = 1)) AND ([Machine_Name] = @p3)
-- @p0: Input Guid (Size = 0; Prec = 0; Scale = 0) [0fbbee53-cf4c-4643-9045-e0a284ad131b]
-- @p1: Input Guid (Size = 0; Prec = 0; Scale = 0) [7a174954-dd18-406e-833d-8da650207d3d]
-- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:20:50 PM]
-- @p3: Input String (Size = 0; Prec = 0; Scale = 0) [CWMOBILEDEV]
-- @p4: Input Boolean (Size = 0; Prec = 0; Scale = 0) [False]
-- @p5: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:20:52 PM]
-- Context: SqlProvider(SqlCE) Model: AttributedMetaModel Build: 3.5.21022.8
Hem Veritabanı Şemasında hem de LINQ sınıflarını oluşturan DBML'de uygun birincil alan değerlerinin tanımlandığını doğruladım.
Sanırım bu neredeyse iki parçalı bir soru:
- İstisna neden atılıyor?
- İkinci oluşturulan SQL kümesini inceledikten sonra, çatışmaları tespit etmek için tüm alanları kontrol etmek güzel olurdu, ancak bunun oldukça verimsiz olacağını düşünüyorum. Bu her zaman böyle mi çalışır? Yalnızca birincil anahtarı kontrol etmek için bir ayar var mı?
Son iki saattir bununla mücadele ediyorum, bu yüzden herhangi bir yardım takdir edilecektir.