اشتراکها
ASP.NET 5 beta 6 منتشر شد
نظرات مطالب
EF Code First #1
- این ویژگیها رو میتونید فراموش کنید. چون مثلا SP در SQL Server CE وجود خارجی ندارد. اما برنامهی نوشته شده با EF به راحتی میتونه با انواع و اقسام بانکهای اطلاعاتی که پروایدر EF برای آنها مهیا باشد، کار کند. برنامه شما به دیتابیس خاصی گره نمیخوره. اگر لازم بود راحت میتونید با تغییر پروایدر و تغییر کانکشن استرینگ، بدون نیازی به تغییر در کدهای خود، از یک بانک اطلاعاتی دیگر استفاده کنید.
- در EF Code first امکان استفاده از SP و امثال آن هم وجود دارد (در جای خودش توضیح خواهم داده به چه نحوی). البته در این حالت برنامه فقط مختص به SQL Server خواهد شد.
- در EF Code first امکان استفاده از SP و امثال آن هم وجود دارد (در جای خودش توضیح خواهم داده به چه نحوی). البته در این حالت برنامه فقط مختص به SQL Server خواهد شد.
Please see the SQL Server Management Studio release notes for a comprehensive list of bug fixes.
بازخوردهای دوره
نصب و راه اندازی مقدماتی Full Text Search
از لوسین برای بانکهای اطلاعاتی سبکی که قابلیتهای Full text search ندارند، بهتر است استفاده شود. برای مثال اگر از SQLite استفاده میکنید یا حتی SQL Server CE (سبکترین نسخهی SQL Server که یک بانک اطلاعاتی embedded محسوب میشود)، لوسین بسیار مناسب است.
برای نمونه در سایت جاری از آن برای تهیه موتور جستجوی سایت استفاده شده و یا حتی برنامهی سبک Viewer بانک اطلاعاتی سایت که با فرمت XML است، از لوسین استفاده میکند.
به صورت خلاصه برای کارهای سبک و یا بانکهای اطلاعاتی embedded، استفاده از لوسین فوق العاده است.
اما برای کار با SQL Server کامل، واقعا نیازی به لوسین نیست. یک زیرساخت کامل و توکار برای Full Text Search دارد که با زبان T-SQL آن یکپارچه است. نگهداری و به روز رسانی آن توسط برنامه نویس در حد صفر است و یکبار که تعریف شد، به خوبی کار میکند. نگهداری ایندکسهای لوسین خودکار نیست و باید توسط برنامه نویس به صورت مجزا هربار که اطلاعات تغییر میکند انجام شود.
برای نمونه در سایت جاری از آن برای تهیه موتور جستجوی سایت استفاده شده و یا حتی برنامهی سبک Viewer بانک اطلاعاتی سایت که با فرمت XML است، از لوسین استفاده میکند.
به صورت خلاصه برای کارهای سبک و یا بانکهای اطلاعاتی embedded، استفاده از لوسین فوق العاده است.
اما برای کار با SQL Server کامل، واقعا نیازی به لوسین نیست. یک زیرساخت کامل و توکار برای Full Text Search دارد که با زبان T-SQL آن یکپارچه است. نگهداری و به روز رسانی آن توسط برنامه نویس در حد صفر است و یکبار که تعریف شد، به خوبی کار میکند. نگهداری ایندکسهای لوسین خودکار نیست و باید توسط برنامه نویس به صورت مجزا هربار که اطلاعات تغییر میکند انجام شود.
نظرات مطالب
مهاجرت از SQL Membership به ASP.NET Identity
سیستم کارش EF Code first هست. این سیستم کدهاش گره خورده به بانک اطلاعاتی خاصی نیست. الان در این مثال رشته اتصالی به یک localdb اشاره میکنه. شما میتونید کلا این رشته و نحوهی تعریف اون رو برای کار با SQL Server یا SQL CE یا هر بانک اطلاعاتی دیگری که پروایدر code first داره، تغییر بدید و استفاده کنید. (و اگر با ef code first آشنایی ندارید، کم کم در آینده نمیتونید با کتابخانههای کمکی و جانبی دات نت کار کنید)
برای ارتقاء برنامههای قدیمی به EF 6 (که با دات نت 4 به بعد سازگار است) دو حالت استفاده از نیوگت را در حین افزودن ارجاعات لازم به کتابخانههای مرتبط با EF باید مدنظر داشت:
الف) از نیوگت استفاده کردهاید
در این حالت فقط کافی است کنسول پاورشل نیوگت را در VS.NET گشوده و دستور update-package را صادر کنید. (1) به صورت خودکار آخرین نگارش EF دریافت شده و (2) همچنین فایل کانفیگ برنامه برای افزودن و به روز رسانی تعاریف مرتبط با نگارش 6 به روز گردیده و (3) همچنین اسمبلی اضافی و قدیمی System.Data.Entity.dll نیز حذف خواهد شد.
ب) اگر از نیوگت استفاده نکردهاید
ابتدا یک فایل متنی ساده را به نام packages.config با محتوای ذیل به پروژه خود اضافه کنید.
سپس بر روی نام Solution در VS.NET کلیک راست کرده و گزینه فعال سازی Restore بستههای نیوگت را فعال کنید (انتخاب گزینه Enable NuGet Package Restore). در ادامه یکبار برنامه را Build کنید تا پوشه packages به صورت خودکار از اینترنت دریافت و بازسازی شود. اکنون دستور update-package را در کنسول پاورشل نیوگت صادر کنید. همان مراحل قسمت الف تکرار خواهند شد.
لازم به ذکر است، اگر پروژه شما از چندین زیر پروژه تشکیل شده است که هر کدام نیز ارجاعی را به اسمبلی EF دارند، باید فایل packages.config فوق را به این زیر پروژهها نیز اضافه کنید. دستور update-package، زیر پروژهها را نیز اسکن کرده و تمام ارجاعات لازم را به صورت خودکار به روز میکند. همچنین اسمبلیهای قدیمی اضافی را نیز حذف خواهد کرد. به این ترتیب با تداخل نگارشهای قدیمی و جدید EF مواجه نخواهید شد.
مشکلاتی که ممکن است با آنها مواجه شوید:
الف) برنامه کامپایل نمیشود
تنها تغییری که جهت کامپایل برنامه باید انجام دهید، استفاده از فضاهای نام جدید بجای فضاهای قدیمی موجود در اسمبلی منسوخ و حذف شده System.Data.Entity.dll است. خود VS.NET قابلیت یافتن فضاهای نام مرتبط را دارد و یا اگر از Resharper نیز استفاده میکنید، این قابلیت بهبود یافته است. در کل مثلا System.Data.EntityState شده است System.Data.Entity.EntityState و امثال آن که به روز رسانی آنها نکته خاصی ندارد .
ب) پروایدر بانک اطلاعاتی مورد استفاده یافت نمیشود
به صورت پیش فرض فقط پروایدر SQL Server به همراه بسته EF 6 است. حتی پروایدر SQL Server CE نیز با آن ارائه نمیشود. اگر از SQL Server CE استفاده کردهاید، باید دستور ذیل را نیز پس از نصب EF 6 صادر کنید:
تا با خطای ذیل مواجه نشوید:
استفاده از نیوگت به روشی که عنوان شد، فایل کانفیگ برنامه شما را جهت افزودن تعاریف پروایدرهای لازم، به روز میکند و این مورد در EF 6 الزامی است (حتما باید تعریف پروایدر در فایل کانفیگ موجود باشد).
ج) خطای عدم وجود کلید خارجی جدول Migration را دریافت میکنید
تا EF 5 نام کلید اصلی جدول MigrationHistory به صورت PK___MigrationHistory میباشد.
در EF 6 این نام شده است PK_dbo.__MigrationHistory
برای حل این مشکل تنها کافی است دستورات ذیل را یکبار بر روی بانک اطلاعاتی خود صادر کنید تا نام مورد نظر به عنوان کلید اصلی جدول migration اضافه شود؛ در غیراینصورت اصلا برنامه اجرا نخواهد شد:
البته یکبار برنامه را اجرا کنید. اگر خطای نبود کلید اصلی یاد شده صادر شد، آنگاه دو دستور فوق را اجرا نمائید.
الف) از نیوگت استفاده کردهاید
در این حالت فقط کافی است کنسول پاورشل نیوگت را در VS.NET گشوده و دستور update-package را صادر کنید. (1) به صورت خودکار آخرین نگارش EF دریافت شده و (2) همچنین فایل کانفیگ برنامه برای افزودن و به روز رسانی تعاریف مرتبط با نگارش 6 به روز گردیده و (3) همچنین اسمبلی اضافی و قدیمی System.Data.Entity.dll نیز حذف خواهد شد.
ب) اگر از نیوگت استفاده نکردهاید
ابتدا یک فایل متنی ساده را به نام packages.config با محتوای ذیل به پروژه خود اضافه کنید.
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="EntityFramework" version="5.0.0" targetFramework="net40" /> </packages>
لازم به ذکر است، اگر پروژه شما از چندین زیر پروژه تشکیل شده است که هر کدام نیز ارجاعی را به اسمبلی EF دارند، باید فایل packages.config فوق را به این زیر پروژهها نیز اضافه کنید. دستور update-package، زیر پروژهها را نیز اسکن کرده و تمام ارجاعات لازم را به صورت خودکار به روز میکند. همچنین اسمبلیهای قدیمی اضافی را نیز حذف خواهد کرد. به این ترتیب با تداخل نگارشهای قدیمی و جدید EF مواجه نخواهید شد.
مشکلاتی که ممکن است با آنها مواجه شوید:
الف) برنامه کامپایل نمیشود
تنها تغییری که جهت کامپایل برنامه باید انجام دهید، استفاده از فضاهای نام جدید بجای فضاهای قدیمی موجود در اسمبلی منسوخ و حذف شده System.Data.Entity.dll است. خود VS.NET قابلیت یافتن فضاهای نام مرتبط را دارد و یا اگر از Resharper نیز استفاده میکنید، این قابلیت بهبود یافته است. در کل مثلا System.Data.EntityState شده است System.Data.Entity.EntityState و امثال آن که به روز رسانی آنها نکته خاصی ندارد .
ب) پروایدر بانک اطلاعاتی مورد استفاده یافت نمیشود
به صورت پیش فرض فقط پروایدر SQL Server به همراه بسته EF 6 است. حتی پروایدر SQL Server CE نیز با آن ارائه نمیشود. اگر از SQL Server CE استفاده کردهاید، باید دستور ذیل را نیز پس از نصب EF 6 صادر کنید:
PM> Install-Package EntityFramework.SqlServerCompact
No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlServerCe.4.0'. Make sure the provider is registered in the 'entityFramework' section of the application config file. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.
ج) خطای عدم وجود کلید خارجی جدول Migration را دریافت میکنید
The foreign key constraint does not exist. [ PK_dbo.__MigrationHistory ]
ALTER TABLE [__MigrationHistory] ADD CONSTRAINT [PK___MigrationHistory] PRIMARY KEY ([MigrationId]);
برای حل این مشکل تنها کافی است دستورات ذیل را یکبار بر روی بانک اطلاعاتی خود صادر کنید تا نام مورد نظر به عنوان کلید اصلی جدول migration اضافه شود؛ در غیراینصورت اصلا برنامه اجرا نخواهد شد:
ALTER TABLE [__MigrationHistory] drop CONSTRAINT [PK___MigrationHistory]; ALTER TABLE [__MigrationHistory] ADD CONSTRAINT [PK_dbo.__MigrationHistory] PRIMARY KEY (MigrationId);
پاسخ به بازخوردهای پروژهها
ارسال پارامترهای اختیاری به دستور Sql و مشکل با دستور is null
- با درایور SQLite امتحان شد و مشکلی مشاهده نشد.
- بنابراین این مورد بستگی دارد به تواناییهای موتور و همچنین درایور بانک اطلاعاتی مورد استفاده (به نظر SQL-CE است) و یک مسالهی عمومی نیست.
- برای حل این مشکل در SQL-CE از روش زیر استفاده کنید:
- بنابراین این مورد بستگی دارد به تواناییهای موتور و همچنین درایور بانک اطلاعاتی مورد استفاده (به نظر SQL-CE است) و یک مسالهی عمومی نیست.
- برای حل این مشکل در SQL-CE از روش زیر استفاده کنید:
... WHERE f.Bar = @bar OR cast(@bar AS varchar(4000)) IS NULL