عنوان:

‫ارتقای سطح سازگاری پیش‌فرض به SQL Server 2022 در EF Core 11


نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۴/۰۱ ۰۹:۲۵
آدرس: www.dntips.ir
در نسخه جدید EF Core 11، ارائه‌دهنده پایگاه داده SQL Server (SQL Server Provider) به صورت پیش‌فرض از Compatibility Level 160 (مربوط به SQL Server 2022) استفاده می‌کند. این تغییر به این معناست که EF Core در زمان تولید کوئری‌های SQL، فرض را بر این می‌گذارد که پایگاه داده شما از جدیدترین ویژگی‌ها و سینتکس‌های SQL Server 2022 پشتیبانی می‌کند. در نتیجه، کوئری‌های بهینه‌تر و مدرن‌تری بدون نیاز به تنظیمات اضافی تولید می‌شوند. اما اگر پایگاه داده شما قدیمی‌تر از نسخه 2022 باشد، این تغییر می‌تواند باعث بروز خطا در اجرای برنامه شود.

نحوه بازگرداندن تنظیمات برای نسخه‌های قدیمی‌تر
اگر پروژه شما از نسخه‌های قدیمی‌تر SQL Server (مانند 2019، 2017 یا قدیمی‌تر) استفاده می‌کند، باید به صورت صریح سطح سازگاری را در DbContext تنظیم کنید. به عنوان مثال، برای سازگاری با SQL Server 2019 (سطح 150):
optionsBuilder.UseSqlServer(
    connectionString,
    sqlServerOptions => sqlServerOptions.UseCompatibilityLevel(150)); // SQL Server 2019

خطاهای احتمالی در صورت عدم تنظیم و استفاده از نسخه‌های قدیمی‌تر
اگر برنامه خود را به EF Core 11 ارتقا دهید اما پایگاه داده شما SQL Server 2019 یا پایین‌تر باشد و کد بالا را اضافه نکنید، در زمان اجرای کوئری‌هایی که از قابلیت‌های جدید استفاده می‌کنند با خطاهای رسمی سمت SQL Server مواجه خواهید شد. مهم‌ترین این خطاها عبارتند از:
- خطای سینتکس برای توابع جدید (مانند GREATEST و LEAST):
EF Core 11 برای ترجمه برخی متدهای LINQ (مانند Math.Max یا Math.Min) از توابع مدرن GREATEST و LEAST استفاده می‌کند که در SQL Server 2022 معرفی شده‌اند. در نسخه‌های قدیمی‌تر با این خطا مواجه می‌شوید: SqlException: 'GREATEST' is not a recognized built-in function name. یا 'LEAST' is not a recognized built-in function name.

- خطا در پردازش JSON (تابع JSON_ARRAY):
در EF Core 11 ترجمه کارهای مرتبط با ستون‌های JSON بهبود یافته و از توابعی مثل JSON_ARRAY استفاده می‌شود. نسخه‌های قدیمی‌تر SQL Server این تابع را نمی‌شناسند: SqlException: 'JSON_ARRAY' is not a recognized built-in function name.

- خطای استفاده از سینتکس جدید IS DISTINCT FROM:
برای مقایسه مقادیر با احتساب وضعیت NULL بودن، EF Core 11 ممکن است از سینتکس مدرن IS DISTINCT FROM یا IS NOT DISTINCT FROM استفاده کند که در نسخه‌های پیش از 2022 وجود ندارد: SqlException: Incorrect syntax near 'DISTINCT'.

نکات اضافه‌تر و بسیار مهم که باید بدانید
- تأثیر مستقیم بر عملکرد (Performance): حتی اگر خطای سینتکس دریافت نکنید، تنظیم درست Compatibility Level به بازنویسی بهینه کوئری‌ها (Query Rewrite) کمک می‌کند. SQL Server 2022 دارای یک ویژگی به نام Parameter Sensitive Plan Optimization است که EF Core 11 با فرض فعال بودن آن، کوئری‌ها را ارسال می‌کند.

- بررسی دیتابیس‌های میزبانی شده در Cloud:
  • اگر از Azure SQL Database یا سرویس‌های ابری داخلی استفاده می‌کنید، حتماً بررسی کنید که سطح سازگاری دیتابیس روی چه عددی تنظیم شده است. گاهی اوقات خودِ دیتابیس ارتقا یافته اما Compatibility Level آن در تنظیمات دیتابیس همچنان روی نسخه‌های قدیمی (مثل 140 یا 150) باقی مانده است.

- استراتژی مهاجرت (Migration):
  • بهترین روش این است که در زمان ارتقا به .NET 11 / EF Core 11، ابتدا کد خود را با UseCompatibilityLevel روی نسخه فعلی دیتابیس خود قفل کنید. سپس پس از ارتقای سرور پایگاه داده به نسخه 2022، این خط کد را حذف کنید تا از مزایای سرعت و سینتکس جدید بهره‌مند شوید.