2010-06-10 3 views
7

güncellemek için başarısız. Nedense, ben isim yanında benim item varlığın her alanını güncelleyebilirsiniz.Linq to SQL - Sql varlıklara linq güncellenmesi ile bazı sorunları yaşıyorum

İşte yazdığım iki basit testler şunlardır:

[TestMethod] 
     public void TestUpdateName() { 
      using (var context = new SimoneDataContext()) { 
       Item item = context.Items.First(); 

       if (item != null) { 
        item.Name = "My New Name"; 
        context.SubmitChanges(); 
       } 
      } 
     } 

     [TestMethod] 
     public void TestUpdateMPN() { 
      using (var context = new SimoneDataContext()) { 
       Item item = context.Items.First(); 

       if (item != null) { 
        item.MPN = "My New MPN"; 
        context.SubmitChanges(); 
       } 
      } 
     } 

Maalesef TestUpdateName() aşağıdaki hata nedeniyle başarısız: System.Data.SqlClient.SqlException: Incorrect syntax near the keyword 'WHERE'..

Ve burada outputted SQL var:

UPDATE [dbo].[Items] SET WHERE ([Id] = @p0) AND ([CategoryId] = @p1) AND ([MPN] = @p2) AND ([Height] = @p3) AND ([Width] = @p4) AND ([Weight] = @p5) AND ([Length] = @p6) AND ([AdministrativeCost] = @p7) -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] -- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [1] -- @p2: Input VarChar (Size = 10; Prec = 0; Scale = 0) [My New MPN] -- @p3: Input Decimal (Size = 0; Prec = 5; Scale = 3) [30.000] -- @p4: Input Decimal (Size = 0; Prec = 5; Scale = 3) [10.000] -- @p5: Input Decimal (Size = 0; Prec = 5; Scale = 3) [40.000] -- @p6: Input Decimal (Size = 0; Prec = 5; Scale = 3) [30.000] -- @p7: Input Money (Size = 0; Prec = 19; Scale = 4) [350.0000] -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926

olarak Gördüğünüz gibi, hiçbir güncelleme oluşturulmuyor (SET boş ...) Bu neden oluyor diye bir fikrim yok.

Ve zaten önceden

... EVET, masa Item bir PK (id) vardır. Teşekkür ederiz önceden!

Güncelleştirme: Hata, GetHashcode() geçersiz kılmadan kaynaklanıyor gibi görünüyor. Bu benim şimdiki uygulamasıdır:

return string.Format("{0}|{1}|{2}|{3}", Name, Id, UPC, AdministrativeCost).GetHashCode();

+0

Eğer Ad ve bir diğer özelliğini değiştirmek ne olur? Hem mi, hem de diğer mülkiyeti mi günceller? Ayrıca oluşturulan kodda 'PropertyChanged' olayını tetikleyen Name setter? DataContext'in olay tetiklenmedikçe bir değişiklik olduğunu düşünmüyorum. –

+0

İsim ve başka bir özelliği değiştirirseniz, yalnızca diğer özellik değişir. –

cevap

12

geliyor. Tabloları silmeli ve yeniden eklemeli ve tekrar çalıştırmayı deneyiniz.

Sadece elle Items tabloyu silmek ve yeniden ekleyin.

DÜZENLEME: Yaptığınız düzenleme doğrultusunda, sen GetHashCode ilgili şu iplik kontrol etmeliyiz.

http://social.msdn.microsoft.com/forums/en-US/linqtosql/thread/6cc6c226-f718-4b22-baad-dba709afe74b/

.Net rules claim that GetHashCode() and Equals() must always be implemented in tandem. Two objects that are equal must have the same hash code.

Also, the combination of GetHashCode() + Equals() forms the entity's concept of identity. If you make it based on field values (other than PK) then the identity changes as you change the fields. This is bad if L2S must lookup other info in a dictionary based on the entity's identity, and especially if L2S needs to find an entity in its identity cache!

Advice: don't change the identity of an entity. L2S expects it to be based on the object's natural (address based) identity.

+0

Sadece tabloyu sildi ve çalışmadı. Ayrıca Hugati araçlarını kullanarak eşitlemeyi denedim ve aynı hatayı alıyorum. –

+0

@Isaac 'TestUpdateMPN 'çalışmıyor ve sadece' TestUpdateName 'başarısız oluyor mu? Bu hata, tablonun dbml tanımı şema ile eşleşmediğinde ortaya çıkar. GetHashCode() öğeleri için – Kelsey

+0

+1. Bu benim sorunum olduğu ortaya çıktı. GetHashCode() tarafından kullanılan alanı değiştirmeye çalışmak. – tandrewnichols

0

SQL SET maddesi (SET sonra hiçbir [Name] = @pXX olduğunu haber) içeriğine dahil değildir oluşturuluyor anlaşılmaktadır. Varlık alanının tüm özellikleri (veri tipi, boyut, vb.) Dbml tasarımcısında doğru şekilde ayarlanmış mı? senin DBML eşzamanlı olmamasına olabilir gibi

+0

Buna dikkat ettim ve bir dakika önce yayını düzenledim. DBML'deki özellikler doğru görünüyor. Ben veritabanı ile senkronize benim DBML şema korumak için Hugati DBML araçlarını kullanın. Cevabınız için teşekkür ederiz. –

+0

@Isaac: En son sürüm hala bu sorunu yansıtıyor ("UPDATE [dbo]" diyor. [Öğeler] WHERE ... '). L2S, güncellenmesi gereken sütunların listesini ve onlarla birlikte gelen değerleri oluşturmaz (UPDATE [dbo] ifadesini beklersiniz. [Öğeler] SET [Ad] = @ p0 WHERE ... 'veya benzer bir şey). –