کلاس های Metadata برای افزودن Data Annotations در DBFirst - asp-mvc

برنامه نویس وب


دوشنبه 29 مرداد
MVC

کلاس های Metadata برای افزودن Data Annotations در DBFirst

یکشنبه, 09 خرداد 1395

در روش DBFirst اول دیتابیس خود را طراحی و پیاده سازی می کنیم بعد از طریق ویژوال استودیو کلاس های مربوط به جدول هامون می سازیم . مشکلی که در این کلاس ها وجود دارد این است که با هر تغییری در فایل edmx کلاس ها دوباره ساخته می شوند و به  این معنیه که اگر ما Data Annotations برای پراپرتی هامون تعیین کرده باشیم با هر تغییر در فایل edmx  از بین میروند و محکوم به یک کار تکراری می شویم. برای رفع این مشکل راه حل های زیادی وجود داره که یکیش می تونه دستکاری فایل های tt باشه که این روش هم مشکلاتی داره چون ممکنه شما بخواید کلا مدل حذف کنید و دوباره مدل از روی دیتابیس بسازید و با این کار مجبورید دوباره فایل های tt دستکاری کنید که به نظرم زیاد جالب نیست. در اینجا من قصد دارم بدون دستکاری کلاس ها و فایل های tt که به صورت خودکار تولید شده این کار انجام بدم.


برای شروع دو فولدر در پوشه Model به نام های Entity و MetaData می سازیم اینکار را برای دسته بندی و جدا سازی کلاسها اصلی با کلاسهای MetaData انجام میدهیم. مدل برنامه را از همان روش قبلی در پوشه Entity اضافه می کنیم و در ادامه به ازای هر کلاس مدل، یک کلاس به همان نام در پوشه MetaData می سازیم. فضای نام کلاس هایی که در پوشه MetaData ساخته ایم را برابر فضای نام کلاسهای اصلی مدل قرار می دهیم و همچنین کلاسها را از نوع partial می کنیم .

اگر دقت کنید کلاسهایی که در Entity هستند هم از نوع partial هستند و ما با اینکار می تونیم بهشون میگیم که قسمتی از شما در جای دیگه هستند . در ادامه یک کلاس دیگر درون کلاس MetaData از نوع partial با نام اسم کلاس به اضافه MetaData می سازیم و پروپرتی های کلاس اصلی را در این کلاس اضافه می کنیم و در نهایت [MetadataType(typeof(UserMetaData))] را بالای کلاس MetaData می گذاریم و حالا می توانیم با خیال راحت Data Annotations های خود را بالای پراپرتی ها بدون ترس از حذف شدنشان بگذاریم .

پیاده سازی آن را در زیر مشاهده می کنید .


//Model

namespace Project.Model.Entity
{
    public partial class User
    {
        public int UserID { get; set; }
        public string UserName { get; set; }
    }
}

 

//MetaData

namespace Project.Model.Entity
{
    [MetadataType(typeof(UserMetaData))]
    public partial class User
    {
        public partial class UserMetaData
        {
            [Key]
            public int UserID { get; set; }

            [Display(Name="نام کاربر")]
            [Required(ErrorMessage = "لطفا {0} را وارد کنید")]
            public string UserName { get; set; }
        }
    }
}


خوبی این روش اینه که حتی اگه مدل رو حذف کنید و دوباره مدل اضافه کنید باز هم Data Annotations های مربوطه به پروپرتی خودش می چسبه و رهاش نمی کنه laugh



نظرات

Drag to order
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

ایدینایدین

سلام واقعا عالی بود منتظر مطالب بعدی شما هستم

       پاسخ: سلام مرسی از نظرتون heart


علیعلی

سلام ممنون از سایت خوبتون


علیعلی

سلام خیلی عالی