2008-12-22 27 views
6

Bu akşam büyük sorununu keşfetmem için bana yol açtığı bu question gönderdim!Linq-to-Sql SubmitChanges alanları güncelleştirmiyor ... neden?

Veritabanımda Units adında bir ondalık sütunu var, her zaman sütunun değerini bir NON SIFIR olarak ayarlıyorum ve Sütun güncellemelerini yeni değerle birlikte gönder. Sütunun değerini SIFIR olarak ayarlamaya çalışırsam, SubmitChanges sütunu güncelleştirmez.

data.Units = this.ReadProperty<decimal>(UnitsProperty); 
data.UnitPrice = this.ReadProperty<decimal>(UnitPriceProperty); 
data.Price = this.ReadProperty<decimal>(PriceProperty); 

Ben DataContext günlüğüne bir göz atmış ve ben SIFIR değeri ile alan sorguya dahil olmadığını görebilirsiniz. Hard kodu denedim bile Linq değişmez.

data.Units = 0; 
data.UnitPrice = 0; 
data.Price = 0; 

Bunun beni öldürdüğünü söylemeye gerek yok! Bunun neden olduğu hakkında bir fikrin var mı?

Çözüm

SO topluluk yardımıyla sorunumu çözdüm. Benim varlığımın eklenmesini oluşturduğumda benim sorunum oluşuyordu, sütunun varsayılan değeri sıfıra ayarlandı, bu yüzden değeri sıfıra atamaya çalıştığında ... LinqToSql diyor ki ... hiçbir şey değişmedi, yani Ben değeri güncellemiyorum. Tüm değerleri zorlamak gibi görünüyor

ctx.DataContext.InvoiceItems.Attach(data, true); 

veritabanına kendilerini yazmak için: sadece iş yapmak için şimdi yapıyorum

... şudur. Bu şimdilik çalışıyor.

+0

Sınıfınızdaki, OnCreated() veya OnChanged() gibi enterferanslara neden olan kısmi yöntemlerden herhangi biri var mı? Modelini üç kere kontrol ettin mi? –

+0

@Dave Silly sorusu ... ama üç kere bağırsak kontrolünden ne demek istiyorsun? – mattruma

+0

Daha erken olduğunu ve henüz kahve içmedim. ;-) Dbml dosyanızın db'ye karşı tanımını (datatypes, nullable, relations) iki kez kontrol ettin mi? –

cevap

2

Sorunumu SO topluluğu yardımıyla çözdüm. Benim varlığımın eklenmesini oluşturduğumda benim sorunum oluşuyordu, sütunun varsayılan değeri sıfıra ayarlandı, bu yüzden değeri sıfıra atamaya çalıştığında ... LinqToSql diyor ki ... hiçbir şey değişmedi, yani Ben değeri güncellemiyorum.

Şimdi ne yapıyorum ...Sadece şu işe emin olmak için: görünüyor

ctx.DataContext.InvoiceItems.Attach(data, true); 

veritabanına kendilerini yazmak için tüm değerleri zorlamak için. Bu şimdilik çalışıyor.

private void Child_Update(Invoice parent) 
{ 
     using (var ctx = Csla.Data.ContextManager 
      .GetManager(Database.ApplicationConnection, false)) 
     { 
      var data = new Gimli.Data.InvoiceItem() 
      { 
       InvoiceItemId = ReadProperty(InvoiceItemIdProperty) 
      }; 

      ctx.DataContext.InvoiceItems.Attach(data); 

      if (this.IsSelfDirty) 
      { 
       // Update properties 
      } 
    } 
} 

Ben bu orijinal değerleri yüklemek düşündüm:

3

Bunu aşağıdaki kodla çoğaltmaya çalıştım, ancak benim için çalışıyor.

using (DataClasses1DataContext ctx = new DataClasses1DataContext()) 
{ 
    var obj = ctx.DecimalColumnTables.First(); 
    Debug.Assert(obj.B != 0); 
    obj.B = 0; 
    ctx.SubmitChanges(); 
} 

Bu nedenle, etki alanınızda buna neden olan özel bir şey olması gerektiğini düşünüyorum. Etki alanı modelinizle basit bir repro oluşturmanızı ve neler olduğunu görmenizi öneriyorum.

LINQ to SQL, geçerli değere yapılan güncellemeleri yok sayar, dolayısıyla alan zaten sıfırsa, herhangi bir güncelleme göremeyebilirsiniz.

Kapalı: Kullandığınız OR/M, LINQ to SQL. LINQ, .NET'teki sorgulama yeteneğinin adıdır, ancak LINQ herhangi bir güncelleme mantığını tanımlamaz veya uygulamaz. Yani sorun LINQ to SQL değil LINQ ile ilgilidir.

+0

Teşekkürler! Bunu kontrol edeceğim! – mattruma

+0

@Gaspar Nagy'de haklıymışsın ... Sql'e Linq, değişimi görmezden geliyordu. – mattruma

2

Açık soru, ancak sütunun dbml/mapping dosyasında eşlendiğinden emin misiniz?

Ayrıca - hesaplanmış bir sütun mu? (yani fiyat = > birim * birim fiyatı)

2

Bazı daha fazla bilgi ... Ben yapıyorum benim sorunumu ... o LinqToSQL ... hakkında anlayış eksikliği daha var anladım ... olan şey, varsayılan değerlerle yeni bir nesne yaratmasıdır ... boş değerler, ondalık değerler için 0, benzersiz tanımlayıcılar için Guid.Empty vb.

Özelliklerini güncelleştirdiğinde, Birimleri zaten 0 olarak görür ve sıfır olarak ayarlar. Peki, LinqToSql bunu bir değişiklik olarak algılamaz, bu nedenle bu alanın tarihine kadar çıkmaz. Yani ne yapmak zorunda şudur: Artık tüm değişiklikler gerçekten bir değişiklik ya da değil olup olmadığını güncelleme açıklamada oluşturulur

ctx.DataContext.InvoiceItems.Attach(data, true); 

. Bu çalışır ... biraz hackish görünüyor!

0

Bu sorunu yaşadım ve gördüğüm tüm başvurular işe yaramadı.

Ama çok basit bir hata yapmış olduğumu buldum!

Özellik güncelleştirilirken aslında özel bir Set yöntemini çağırıyordum (çünkü söz konusu ana özelliğe yanıt olarak değiştirilmesi gereken başka şeyler vardı).

Saat başı çizilmeden sonra Set yöntemimin özel üyeyi değil, public özelliğini güncellediğini fark ettim, yani this._Walking = value;

Tek yapmam gereken bunu değiştirmekti. ve her şey işe başladı!

:

1

doğru cevap gibi birçok modifiye olarak kabul etmektir bir boolean parametre kabul hangi takın (başka aşırı kullanmak gibi bir hataya ve basitçe çalışmayacaktır) özel aşırı kullanımı işaret edilmektedir Ancak, "timestamp" türünde bir "Sürüm" sütununa sahip olmanızın yine de gerektiğini unutmayın.

İlgili konular