Sık Sorulan Sorular

Aşağıdaki bölümlerde LINQ uygularken karşılaşabileceğiniz bazı yaygın sorunlar yanıtlanmıştır.

Ek sorunlar Sorun Giderme bölümünde giderilir.

Bağlan

Veritabanıma bağlanamıyorum.

bağlantı dizesi doğru olduğundan ve SQL Server örneğinizin çalıştığından emin olun. AYRıCA LINQ to SQL için Adlandırılmış Kanallar protokollerinin etkinleştirilmesi gerektiğini unutmayın. Daha fazla bilgi için bkz . İzlenecek Yollara Göre Öğrenme.

VeritabanındaKi Değişiklikler Kayboldu

Veritabanındaki verilerde değişiklik yaptım, ancak uygulamamı yeniden düzenlediğimde değişiklik artık yoktu.

Sonuçları veritabanına kaydetmek için arama SubmitChanges yaptığınızdan emin olun.

Veritabanı Bağlan: Ne Kadar Süre Aç?

Veritabanı bağlantım ne kadar süre açık kalıyor?

Siz sorgu sonuçlarını tüketene kadar bağlantı genellikle açık kalır. Tüm sonuçları işlemek için zaman almayı bekliyorsanız ve sonuçları önbelleğe almaya karşı değilseniz sorguya uygulayın ToList . Her nesnenin yalnızca bir kez işlendiği yaygın senaryolarda akış modeli hem hem de DataReader LINQ to SQL'de üstündür.

Bağlantı kullanımının tam ayrıntıları aşağıdakilere bağlıdır:

Sorgulama olmadan güncelleştirme

Önce veritabanını sorgulamadan tablo verilerini güncelleştirebilir miyim?

LINQ to SQL'de ayar tabanlı güncelleştirme komutları olmasa da, ilk sorgulama yapmadan güncelleştirmek için aşağıdaki tekniklerden birini kullanabilirsiniz:

  • SQL kodu göndermek için kullanın ExecuteCommand .

  • Nesnenin yeni bir örneğini oluşturun ve güncelleştirmeyi etkileyen tüm geçerli değerleri (alanları) başlatın. Ardından, değiştirmek istediğiniz alanı kullanarak Attach nesnesini DataContext öğesine ekleyin ve değiştirin.

Beklenmeyen Sorgu Sonuçları

Sorgum beklenmeyen sonuçlar döndürleniyor. Gerçekleşenleri nasıl inceleyebilirim?

LINQ to SQL, oluşturduğu SQL kodunu incelemek için çeşitli araçlar sağlar. En önemlilerinden biri .Log Daha fazla bilgi için bkz . Hata Ayıklama Desteği.

Beklenmeyen Saklı Yordam Sonuçları

Dönüş değeri 'MAX()' ile hesaplanan bir saklı yordamım var. Saklı yordamı O/R Tasarım Aracı yüzeyine sürüklediğimde dönüş değeri doğru değil.

LINQ to SQL, saklı yordamlar yoluyla veritabanı tarafından oluşturulan değerleri döndürmek için iki yol sağlar:

  • Çıkış sonucunu adlandırarak.

  • Açıkça bir çıkış parametresi belirterek.

Aşağıda hatalı çıkış örneği verilmiştir. LINQ to SQL sonuçları eşleyemediğinden her zaman 0 döndürür:

create procedure proc2

as

begin

select max(i) from t where name like 'hello'

end

Aşağıda, çıkış parametresi kullanılarak doğru çıktı örneği verilmiştir:

create procedure proc2

@result int OUTPUT

as

select @result = MAX(i) from t where name like 'hello'

go

Aşağıda, çıkış sonucunu adlandırarak doğru çıktı örneği verilmiştir:

create procedure proc2

as

begin

select nax(i) AS MaxResult from t where name like 'hello'

end

Daha fazla bilgi için bkz . Saklı Yordamları Kullanarak İşlemleri Özelleştirme.

Serileştirme Hataları

Serileştirmeye çalıştığımda şu hatayı alıyorum: "'System.Data.Linq.ChangeTracker+StandardChangeTracker' yazın... serileştirilebilir olarak işaretlenmez."

LINQ to SQL'de kod oluşturma, serileştirmeyi destekler DataContractSerializer . veya BinaryFormatter'i desteklemezXmlSerializer. Daha fazla bilgi için bkz . Serileştirme.

Birden Çok DBML Dosyası

Bazı tabloları ortak olarak paylaşan birden çok DBML dosyam olduğunda derleyici hatası alıyorum.

Nesne İlişkisel Tasarımcısı Bağlam Ad Alanı ve Varlık Ad Alanı özelliklerini her DBML dosyası için ayrı bir değere ayarlayın. Bu yaklaşım ad/ad alanı çakışmasını ortadan kaldırır.

Ekleme veya Güncelleştirmede Veritabanı Tarafından Oluşturulan Değerlerin Açık Ayarını Önleme

Varsayılan olarak SQL 'Getdate()' olan 'DateCreated' sütununa sahip bir veritabanı tablom var. LINQ to SQL kullanarak yeni bir kayıt eklemeye çalıştığımda, değer 'NULL' olarak ayarlıyor. Veritabanının varsayılan değerine ayarlanmasını beklerdim.

LINQ to SQL, kimlik (otomatik artırma) ve rowguidcol (veritabanı tarafından oluşturulan GUID) ve zaman damgası sütunları için bu durumu otomatik olarak işler. Diğer durumlarda ve=//OnUpdateOnInsertAutoSyncAlways özelliklerini el ile ayarlamanız IsDbGenerated=true gerekir.

Birden Çok DataLoadOptions

İlkinin üzerine yazmadan ek yükleme seçenekleri belirtebilir miyim?

Evet. Aşağıdaki örnekte olduğu gibi ilkinin üzerine yazılmaz:

Dim dlo As New DataLoadOptions()
dlo.LoadWith(Of Order)(Function(o As Order) o.Customer)
dlo.LoadWith(Of Order)(Function(o As Order) o.OrderDetails)
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Order>(o => o.Customer);
dlo.LoadWith<Order>(o => o.OrderDetails);

SQL Compact 3.5 Kullanma Hataları

Tabloları SQL Server Compact 3.5 veritabanından sürüklediğimde hata alıyorum.

LINQ to SQL çalışma zamanı desteklemesine rağmen Nesne İlişkisel Tasarımcısı SQL Server Compact 3.5'i desteklemez. Bu durumda, kendi varlık sınıflarınızı oluşturmanız ve uygun öznitelikleri eklemeniz gerekir.

Devralma İlişkilerindeki Hatalar

İki varlığı bağlamak için Nesne İlişkisel Tasarımcısı araç kutusu devralma şeklini kullandım, ancak hata alıyorum.

İlişki oluşturmak yeterli değildir. Ayrımcı sütun, temel sınıf ayrıştırıcı değeri ve türetilmiş sınıf ayrıştırıcı değeri gibi bilgiler sağlamanız gerekir.

Sağlayıcı Modeli

Genel sağlayıcı modeli kullanılabilir mi?

Kullanılabilir genel sağlayıcı modeli yoktur. Şu anda LINQ to SQL yalnızca SQL Server ve SQL Server Compact 3.5'i destekler.

SQL Ekleme Saldırıları

LINQ to SQL, SQL ekleme saldırılarına karşı nasıl korunur?

SQL ekleme, kullanıcı girişinin birleştirilmesiyle oluşturulan geleneksel SQL sorguları için önemli bir risk olmuştur. LINQ to SQL, sorgularda kullanarak SqlParameter bu tür eklemeleri önler. Kullanıcı girişi parametre değerlerine dönüştürülür. Bu yaklaşım, kötü amaçlı komutların müşteri girişinden kullanılmasını engeller.

DBML Dosyalarında Salt Okunur Bayrağını Değiştirme

DBML dosyasından nesne modeli oluşturduğumda bazı özelliklerden ayarlayıcıları ortadan Nasıl yaparım??

Bu gelişmiş senaryo için aşağıdaki adımları uygulayın:

  1. .dbml dosyasında bayrağını Trueolarak değiştirerek özelliğini değiştirinIsReadOnly.

  2. Kısmi bir sınıf ekleyin. Salt okunur üyeler için parametreler içeren bir oluşturucu oluşturun.

  3. Bunun uygulamanız için doğru değer olup olmadığını belirlemek için varsayılan UpdateCheck değeri (Never) gözden geçirin.

    Dikkat

    Visual Studio'da Nesne İlişkisel Tasarımcısı kullanıyorsanız değişikliklerinizin üzerine yazılabilir.

APTCA

System.Data.Linq kısmen güvenilen kod tarafından kullanılmak üzere işaretlenmiş mi?

Evet, System.Data.Linq.dll derlemesi özniteliğiyle AllowPartiallyTrustedCallersAttribute işaretlenmiş .NET Framework derlemeleri arasındadır. Bu işaret olmadan, .NET Framework'teki derlemeler yalnızca tam güvenilir kod tarafından kullanılmak üzere tasarlanmıştır.

KıSMEN güvenilen arayanlara izin vermek için LINQ to SQL'deki temel senaryo, GÜVEN yapılandırması Orta olan Web uygulamalarından LINQ to SQL derlemesine erişilebilmesini sağlamaktır.

Birden Çok Tablodan Veri Eşleme

Varlığımdaki veriler birden çok tablodan geliyor. haritasını Nasıl yaparım??

Veritabanında bir görünüm oluşturabilir ve varlığı görünümle eşleyebilirsiniz. LINQ to SQL, görünümler için tablolarla aynı SQL'i oluşturur.

Not

Bu senaryoda görünümlerin kullanımında sınırlamalar vardır. Bu yaklaşım, üzerinde Table<TEntity> gerçekleştirilen işlemler temel alınan görünüm tarafından desteklendiğinde en güvenli şekilde çalışır. Hangi işlemlerin amaçlandığı yalnızca siz bilirsiniz. Örneğin, çoğu uygulama salt okunurdur ve başka bir boyutlandırılabilir sayı yalnızca görünümlerde saklı yordamları kullanarak işlemleri gerçekleştirirCreateDelete/Update/.

Bağlantı Havuzu

DataContext havuzuna yardımcı olabilecek bir yapı var mı?

örneklerini DataContextyeniden kullanmayı denemeyin. Her DataContext biri belirli bir düzenleme/sorgu oturumu için durumu (kimlik önbelleği dahil) korur. Veritabanının geçerli durumuna göre yeni örnekler elde etmek için yeni DataContextbir kullanın.

Temel ADO.NET bağlantı havuzunu kullanmaya devam edebilirsiniz. Daha fazla bilgi için bkz. SQL Server Bağlan ion Pooling (ADO.NET).

İkinci DataContext Güncelleştirilmedi

Veritabanındaki değerleri depolamak için DataContext'in bir örneğini kullandım. Ancak, aynı veritabanındaki ikinci bir DataContext güncelleştirilmiş değerleri yansıtmaz. İkinci DataContext örneği önbelleğe alınmış değerler döndürecek gibi görünüyor.

Bu davranış, tasarım gereğidir. LINQ to SQL, ilk örnekte gördüğünüz örnekleri/değerleri döndürmeye devam eder. Güncelleştirmeler yaptığınızda iyimser eşzamanlılık kullanırsınız. Özgün veriler, aslında hala değişmediğini onaylaması için geçerli veritabanı durumunu denetlemek için kullanılır. Bu değişiklik olursa bir çakışma oluşur ve uygulamanızın bu sorunu çözmesi gerekir. Uygulamanızın bir seçeneği özgün durumu geçerli veritabanı durumuna sıfırlamak ve güncelleştirmeyi yeniden denemektir. Daha fazla bilgi için bkz . Nasıl yapılır: Değişiklik Çakışmalarını Yönetme.

Önbelleğe alma ve değişiklik izlemeyi kapatan false olarak da ayarlayabilirsiniz ObjectTrackingEnabled . Daha sonra her sorguladığınızda en son değerleri alabilirsiniz.

Salt Okunur Modda SubmitChanges Çağrılamıyor

SubmitChanges'i salt okunur modda çağırmaya çalıştığımda bir hata alıyorum.

Salt okunur mod, bağlamın değişiklikleri izleme özelliğini kapatır.