Aracılığıyla paylaş


Entity Framework için SqlClient’ta Bilinen Sorunlar

Bu bölümde, SQL Server (SqlClient) için .NET Framework Veri Sağlayıcısı ile ilgili bilinen sorunlar açıklanmaktadır.

Dize İşlevlerinde Sondaki Boşluklar

SQL Server, dize değerlerinde sondaki boşlukları yoksayar. Bu nedenle, dizede sondaki boşlukların geçirilmesi, öngörülemeyen sonuçlara, hatta hatalara yol açabilir.

Dizenizde sonda boşluklar olması gerekiyorsa, SQL Server'ın dizeyi kırpmaması için sonuna bir boşluk karakteri eklemeyi düşünmelisiniz. Sondaki boşluklar gerekli değilse, sorgu işlem hattına geçirilmeden önce kırpılmalıdır.

RIGHT İşlevi

Değer olmayannull bir ilk bağımsız değişken olarak geçirilirse ve 0, ikinci bağımsız değişken olarak , 0 veya RIGHT(varchar(max)0'a RIGHT(nvarchar(max))) geçirilirse, dize yerine bir NULLempty değer döndürülür.

CROSS ve OUTER APPLY İşleçleri

CROSS ve OUTER APPLY işleçleri SQL Server 2005'te kullanıma sunulmuştur. Bazı durumlarda sorgu işlem hattı CROSS APPLY ve/veya OUTER APPLY işleçlerini içeren bir Transact-SQL deyimi üretebilir. SQL Server'ın SQL Server 2005'ten önceki sürümleri de dahil olmak üzere bazı arka uç sağlayıcıları bu işleçleri desteklemediğinden, bu tür sorgular bu arka uç sağlayıcılarında yürütülemez.

Aşağıda, çıkış sorgusunda CROSS APPLY ve/veya OUTER APPLY işleçlerinin bulunmasına yol açabilecek bazı tipik senaryolar verilmiştir:

  • Sayfalama ile bağıntılı alt sorgu.

  • AnyElement Bağıntılı bir alt sorgu veya gezinti tarafından üretilen bir koleksiyon üzerinden.

  • Öğe seçici kabul eden gruplandırma yöntemlerini kullanan LINQ sorguları.

  • CROSS APPLY veya OUTER APPLY öğesinin açıkça belirtildiği sorgu

  • REF yapısı üzerinde DEREF yapısına sahip bir sorgu.

SKIP İşleci

SQL Server 2000 kullanıyorsanız, anahtar olmayan sütunlarda ORDER BY ile SKIP kullanmak yanlış sonuçlar döndürebilir. Anahtar olmayan sütunda yinelenen veriler varsa belirtilen sayıda satır atlanabilir. Bunun nedeni, SKIP'in SQL Server 2000 için çevrilmesidir. Örneğin, aşağıdaki sorguda yinelenen değerler varsa E.NonKeyColumn beşten fazla satır atlanabilir:

SELECT [E] FROM Container.EntitySet AS [E] ORDER BY [E].[NonKeyColumn] DESC SKIP 5L  

Doğru SQL Server Sürümünü Hedefleme

Entity Framework, Transact-SQL sorgusunu, depolama modeli (.ssdl) dosyasındaki Schema öğesinin özniteliğinde ProviderManifestToken belirtilen SQL Server sürümüne göre hedefler. Bu sürüm, bağlı olduğunuz gerçek SQL Server sürümünden farklı olabilir. Örneğin, SQL Server 2005 kullanıyorsanız ancak özniteliğiniz ProviderManifestToken 2008 olarak ayarlandıysa, oluşturulan Transact-SQL sorgusu sunucuda yürütülmeyebilir. Örneğin, SQL Server 2008'de tanıtılan yeni tarih saat türlerini kullanan bir sorgu, SQL Server'ın önceki sürümlerinde yürütülmeyecektir. SQL Server 2005 kullanıyorsanız ancak özniteliğiniz ProviderManifestToken 2000 olarak ayarlandıysa, oluşturulan Transact-SQL sorgusu daha az iyileştirilmiş olabilir veya sorgunun desteklenmediğini belirten bir özel durum alabilirsiniz. Daha fazla bilgi için, bu konunun önceki bölümlerindeki CROSS ve OUTER APPLY operators bölümüne bakın.

Bazı veritabanı davranışları, veritabanına ayarlanan uyumluluk düzeyine bağlıdır. Özniteliğiniz ProviderManifestToken 2005 ve SQL Server sürümünüz 2005 olarak ayarlanmışsa, ancak veritabanının uyumluluk düzeyi "80" (SQL Server 2000) olarak ayarlanmışsa, oluşturulan Transact-SQL SQL SQL Server 2005'i hedefler ancak uyumluluk düzeyi ayarı nedeniyle beklendiği gibi yürütülmeyebilir. Örneğin, ORDER BY listesindeki bir sütun adı seçicideki bir sütun adıyla eşleşiyorsa sıralama bilgilerini kaybedebilirsiniz.

Projeksiyonda İç İçe Sorgular

Projeksiyon yan tümcesindeki iç içe yerleştirilmiş sorgular, sunucudaki Kartezyen ürün sorgularına çevrilebilir. SQL Server da dahil olmak üzere bazı arka uç sunucularında bu, TempDB tablosunun oldukça büyük olmasını sağlayabilir. Bu, sunucu performansını düşürebilir.

Aşağıda, projeksiyon yan tümcesinde iç içe sorgu örneği verilmiştir:

SELECT c, (SELECT c, (SELECT c FROM AdventureWorksModel.Vendor AS c  ) As Inner2 FROM AdventureWorksModel.JobCandidate AS c  ) As Inner1 FROM AdventureWorksModel.EmployeeDepartmentHistory AS c  

Sunucu Tarafından Oluşturulan GUID Kimlik Değerleri

Entity Framework, sunucu tarafından oluşturulan GUID türü kimlik değerlerini destekler, ancak sağlayıcının bir satır eklendikten sonra sunucu tarafından oluşturulan kimlik değerini döndürmeyi desteklemesi gerekir. SQL Server 2005'den başlayarak, OUTPUT yan tümcesi aracılığıyla SQL Server veritabanında sunucu tarafından oluşturulan GUID türünü döndürebilirsiniz.

Ayrıca bkz.