Masalah yang Diketahui di SqlClient untuk Kerangka Kerja Entitas
Bagian ini menjelaskan masalah umum terkait dengan Penyedia Data .NET Framework untuk SQL Server (SqlClient).
Spasi di Akhir dalam Fungsi String
SQL Server mengabaikan spasi di akhir dalam nilai string. Oleh karena itu, meneruskan spasi di akhir dalam string dapat menyebabkan hasil yang tidak terduga, bahkan kegagalan.
Jika Anda harus memiliki spasi di akhir dalam string, Anda harus mempertimbangkan untuk menambahkan karakter spasi kosong di akhir, sehingga SQL Server tidak memangkas string. Jika spasi di akhir tidak diperlukan, spasi tersebut harus dipangkas sebelum diteruskan ke alur kueri.
Fungsi RIGHT
Jika nilai non-null
diteruskan sebagai argumen pertama dan 0 diteruskan sebagai argumen kedua ke RIGHT(nvarchar(max)
, 0)
atau RIGHT(varchar(max)
, 0)
, nilai NULL
akan dikembalikan alih-alih string empty
.
Operator CROSS dan OUTER APPLY
Operator CROSS dan OUTER APPLY diperkenalkan di SQL Server 2005. Dalam beberapa kasus, alur kueri mungkin menghasilkan pernyataan Transact-SQL yang berisi operator CROSS APPLY dan/atau OUTER APPLY. Karena beberapa penyedia backend, termasuk versi SQL Server yang lebih lama dari SQL Server 2005, tidak mendukung operator ini, kueri tersebut tidak dapat dijalankan pada penyedia backend ini.
Berikut ini adalah beberapa skenario umum yang mungkin menyebabkan adanya operator CROSS APPLY dan/atau OUTER APPLY dalam kueri output:
Subkueri berkorelasi dengan paging.
AnyElement
pada subkueri yang berkorelasi, atau pada koleksi yang dihasilkan oleh navigasi.Kueri LINQ yang menggunakan metode pengelompokan yang menerima pemilih elemen.
Kueri di mana CROSS APPLY atau OUTER APPLY ditentukan secara eksplisit
Kueri yang memiliki konstruk DEREF di atas konstruk REF.
Operator SKIP
Jika Anda menggunakan SQL Server 2000, menggunakan SKIP dengan ORDER BY pada kolom non-kunci mungkin mengembalikan hasil yang salah. Jumlah baris yang lebih dari yang ditentukan mungkin dilewati jika kolom non-kunci memiliki data duplikat di dalamnya. Ini karena cara SKIP diterjemahkan untuk SQL Server 2000. Misalnya, dalam kueri berikut, lebih dari lima baris mungkin dilewati jika E.NonKeyColumn
memiliki nilai duplikat:
SELECT [E] FROM Container.EntitySet AS [E] ORDER BY [E].[NonKeyColumn] DESC SKIP 5L
Menargetkan Versi SQL Server yang Benar
Entity Framework menargetkan kueri Transact-SQL berdasarkan versi SQL Server yang ditentukan dalam atribut ProviderManifestToken
dari elemen Schema dalam file model penyimpanan (.ssdl). Versi ini mungkin berbeda dari versi SQL Server sebenarnya tempat Anda terhubung. Misalnya, jika Anda menggunakan SQL Server 2005, tetapi atribut ProviderManifestToken
Anda diatur ke 2008, kueri Transact-SQL yang dihasilkan mungkin tidak dijalankan di server. Misalnya, kueri yang menggunakan jenis waktu tanggal baru yang diperkenalkan di SQL Server 2008 tidak akan dijalankan pada versi SQL Server yang lebih lama. Jika Anda menggunakan SQL Server 2005, tetapi atribut ProviderManifestToken
Anda diatur ke 2000, kueri Transact-SQL yang dihasilkan mungkin kurang dioptimalkan, atau Anda mungkin mendapatkan pengecualian yang menyatakan bahwa kueri tidak didukung. Untuk informasi selengkapnya, lihat bagian Operator CROSS dan OUTER APPLY, yang dibahas sebelumnya dalam topik ini.
Perilaku database tertentu bergantung pada tingkat kompatibilitas yang diatur ke database. Jika atribut ProviderManifestToken
Anda diatur ke 2005 dan versi SQL Server Anda 2005, tetapi tingkat kompatibilitas database diatur ke "80" (SQL Server 2000), Transact-SQL yang dihasilkan akan menargetkan SQL Server 2005, tetapi mungkin tidak berjalan seperti yang diharapkan karena pengaturan tingkat kompatibilitas. Misalnya, Anda mungkin kehilangan informasi pengurutan jika nama kolom dalam daftar ORDER BY cocok dengan nama kolom di pemilih.
Kueri yang Disarangkan dalam Proyeksi
Kueri yang disarangkan dalam klausul proyeksi mungkin diterjemahkan ke dalam kueri produk Cartesian di server. Pada beberapa server back-end, termasuk SQL Server, ini dapat menyebabkan tabel TempDB menjadi cukup besar. Hal ini dapat menurunkan performa server.
Berikut ini adalah contoh kueri yang disarangkan dalam klausul proyeksi:
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
Nilai Identitas GUID yang Dibuat Server
Entity Framework mendukung nilai identitas jenis GUID yang dibuat server, tetapi penyedia harus mendukung pengembalian nilai identitas yang dibuat server setelah baris dimasukkan. Mulai dari SQL Server 2005, Anda dapat mengembalikan jenis GUID yang dibuat server dalam database SQL Server melalui klausul OUTPUT.