2008-09-02 21 views
6

Veritabanından bağlantısı kesilen varlıkları nasıl güncelleyebilirim?Linq Güncelleştirmesi

Aşağıdaki kod düzgün çalışmıyor ve InvalidOperationExcepiton atar.

public void Foo() 
{ 
DataContext context = new DataContext(); 
LinqEntity item = new LinqEntity(){ Id = 1, Name = "John", Surname = "Doe"} ; 
context.LinqEntities.Attach(item, true); 
} 

cevap

3

Varsayılan olarak, varlıklar düzenleme yaparken eşzamanlılığı denetlemek için tüm alanları kullanır. InvalidOperationException öğesini atayan budur.

Bu, tüm alanlar için Güncelle Denetle özelliğini Hiçbiri olarak ayarlıyor olabilir. Bu varlığın değiştirilmiş olarak eklenebilmesi için tüm alanlarda yapılmalıdır. Bu yapılırsa, context.SubmitChanges() için ek bir çağrı verileri kaydeder.

Alternatif olarak, orijinal değerleri biliyorsanız, ekleyebilir ve güncelleştirmeler yapabilirsiniz, ancak kontrol edilen tüm değerler orijinal değerlerle eşleşmelidir.

LinqEntity item = new LinqEntity(){ Id = 1, Name = "OldName", Surname = "OldSurname"}; 
context.LinqEntities.Attach(item); 
item.Name = "John"; 
item.Surname = "Doe"; 
context.SubmitChanges(); 
1

Veritabanından bağlantısı kesildiğinde ne demek istediğinden emin değilim.

LinqEntities tablosuna yeni bir satır eklemeye çalıştığınız anlaşılıyor - bu doğru mu? o Eğer ID = 1 ile satır güncellemek için çalışıyorsanız,

context.LinqEntities.InsertOnSubmit(item); 
context.Submit(); 
1

Tamam yapmak isteyeceksiniz durumda

, böyle yapacağım:

DataContext context = new DataContext(); 
LinqEntity item = (from le in context.LinqEntities 
        where le.ID == 1 
        select le).Single(); 
item.Name = "John"; 
item.Surname = "Doe"; 

context.Submit(); 

Ayrıca daha özlü lambda'da Linq ifadeyi değiştirmek olabilir: DataContext yapar

LinqEntity item = context.LinqEntities.Single(le => le.ID == 1); 

en önemli şey trac olduğunu k yaptığınız değişiklikler, böylece Gönder yöntemini çağırdığınızda, değiştirdiğiniz şeylerin Ekleme ifadelerini otomatik olarak oluşturur.

0

Bir ORM kullanıldığında, onu güncellemeden önce genellikle bir nesne seçersiniz.

Seçmek istemiyorsanız ORT'yi atlamak için DataContext.ExecuteCommand(...) kullanabilirsiniz.

+0

Bu davranışın normal olduğunu bildiren ifadeye katılmıyorum. ActiveRecord desenini uygulayan herhangi bir ORM'de durum böyle değildir. Birçok kişinin görüşüne göre, bu Linq To SQL'in bir sınırlamasıdır. Burada bazı iyi tartışmalar: http://www.west-wind.com/Weblog/posts/135659.aspx –

+0

Linq-to-sql, Aktif Kayıt uygulamıyor. – liammclennan