اگر در ASP.NET MVC از روش Database First برای کار با دیتابیس تان استفاده کرده باشید قطعا با یک مشکل آزار دهنده روبرو شده اید:
پس از افزودن صفت های Metadata به کلاس های ساخته شده توسط EF ، پس از هر گونه تغییر در ترکیب مدل، تمام صفت ها پاک می شوند!
راهکار حل این مشکل استفاده از کلاس های Metadata Buddy Classes است. با استفاده از این کلاس ها می توان صفت ها را در یک کلاس جداگانه نگهداری کرد که در معرض خطر Overwrite شدن توسط بازسازی کلاس ها برای برخورداری از تغییرات مدل قرار نگیرند.
این کلاس ها با افزودن یک صفت به نام [MetadataType] به بالای کلاس های مدل انجام می شود. صفت فوق نیز در Namespace ای به نام System.ComponentModel.DataAnnotations قرار دارد. این Namespace هم باید در لیست using های هر کلاس مدل Import شود تا صفت فوق کار کند.
مشکل اینجاست که با هر بار بازسازی کلاس های مدل، صفت MetadataType و Namespace حاوی این صفت از درون کلاس های مدل پاک می شوند.
با تماشای این ویدئو می توانید یاد بگیرید چگونه با دستکاری کردن قالب های T4 مربوط به Entity Framework می توانید این مشکلات را حل کنید.
7 نظر تا کنون ثبت شده است
محمدرضا خوشبختی داریان
یکشنبه 15 مهر 1397 ساعت 13:32بسیار کاربردی و دقیق بود. استاد نظر شما استفاده از کد فرست هست یا دیتابیس فرست؟ برای پروژه های در حد فروشگاه و اتوماسیون اداری متوسط کدوم رو پیشنهاد میدید؟
مهدی کرامتی
شنبه 18 اسفند 1397 ساعت 17:09من در اکثر پروژه های شخصی ام از روش Database First استفاده می کنم.
ابراهیم رمضانی
دوشنبه 12 فروردین 1398 ساعت 13:09سلام استاد این مشکل پدر ما رو درآورده بود ... خیلی لطف کردید
رضا محمدزاده
پنجشنبه 19 اردیبهشت 1398 ساعت 14:04با تشکر از کمکتون . ممنونم
حبیب تیموری
یکشنبه 13 بهمن 1398 ساعت 22:22سلام جناب کرامتی .ممنون از آموزش های خوبتون. آیا در core هم روشی برای این کار وجود داره ؟ و یا اصلا روش دیتابیس فرست رو در core هم پیشنهاد می کنین؟
مهدی کرامتی
یکشنبه 13 بهمن 1398 ساعت 23:53سلام. در EF Core دیگه روش Database First وجود نداره و فقط Code First کار می کنه. بنابراین Metadata رو مستقیما روی خود کلاس های مدل می توانید اضافه کنید و چون فقط خودتون مسئول به روز رسانی کلاس ها هستید خیال تون راحته که این تغییرات از بین نمیره.
farzad pmh
سه شنبه 11 شهریور 1399 ساعت 14:15نوکرم. عالی بود