طراحی یک مدل از روی EDMX
بسم الله الرحمن الرحیم
آموزش asp.net mvc
بنده شخصا از روش Code First در تولید وب سایت های MVC استفاده می کنم. ولی شروع فراگیریم در ارتباط با MVC به صورت روش معمولی یا همان روش طراحی پایگاه داده با SQL و سپس اضافه کردن مدل مربوطه به پروژه و... بود. برخی از دوستان از همین روش هنوز برای طراحی پروژه های MVC استفاده می کنند، به همین دلیل با مشکلاتی مواجه می شوند (البته هر روشی مزایا و معایب خود دارد در این بخش قصد ندارم در خصوص مزایا و معایب روش ها صحبت کنم بلکه مقصود ارائه راه حل در مورد مشکلات است). یکی از مشکلاتی که با آن مواجه خواهیم شد بحث DataAnnotations و Metadata هایی است که شما برای ساخت یک View سفارشی کد نویسی می کنید. خوب هر بار که شما پایگاه داده خود را تغییر دهید و بخواهید به هر دلیلی مجددا از پایگاه داده خود Model ها را مجددا ایجاد کنید تمامی کد نویسی شما از بین خواهد رفت.
برای حل این مشکل کافی است که یک کلاس Partial تعریف نمایید و در آن فیلدهای خود را در آن بنویسید و سپس یک کلاس برای نگهداری Metadata تعریف نمایید، به این کلاس ها Buddy می گویند.
بسم الله الرحمن الرحیم
آموزش asp.net mvc
بنده شخصا از روش Code First در تولید وب سایت های MVC استفاده می کنم. ولی شروع فراگیریم در ارتباط با MVC به صورت روش معمولی یا همان روش طراحی پایگاه داده با SQL و سپس اضافه کردن مدل مربوطه به پروژه و... بود. برخی از دوستان از همین روش هنوز برای طراحی پروژه های MVC استفاده می کنند، به همین دلیل با مشکلاتی مواجه می شوند (البته هر روشی مزایا و معایب خود دارد در این بخش قصد ندارم در خصوص مزایا و معایب روش ها صحبت کنم بلکه مقصود ارائه راه حل در مورد مشکلات است). یکی از مشکلاتی که با آن مواجه خواهیم شد بحث DataAnnotations و Metadata هایی است که شما برای ساخت یک View سفارشی کد نویسی می کنید. خوب هر بار که شما پایگاه داده خود را تغییر دهید و بخواهید به هر دلیلی مجددا از پایگاه داده خود Model ها را مجددا ایجاد کنید تمامی کد نویسی شما از بین خواهد رفت.
برای حل این مشکل کافی است که یک کلاس Partial تعریف نمایید و در آن فیلدهای خود را در آن بنویسید و سپس یک کلاس برای نگهداری Metadata تعریف نمایید، به این کلاس ها Buddy می گویند.
مثال: ابتدا کلاس اصلی که توسط ORM ساخته شده است را می بینید
public partial class User
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string NationalCode { get; set; }
public string WebAdderss { get; set; }
}
خوب ما هیچ کاری را بر روی این کلاس انجام نمی دهیم. نکته، خود مایکروسافت این کلاس را نیز به صورت partial تعریف کرده است!!
حال باید کلاس Buddy خود را که می خواهیم Metadata را در آن ذخیره کنیم ایجاد نماییم. کلاس ما به این صورت است:
public class BuddyUser
{
[ScaffoldColumn(true)]
public int Id { get; set; }
[DataType(DataType.Url)]
public string WebAdderss { get; set; }
}
حال باید یک کلاس را برای ارتباط این دو کلاس یک کلاس جدید تعریف نماییم. این کلاس به صورت زیر است:
[MetadataType(typeof(BuddyUser))]
public partial class User
{
}
در تعریف این کلاس باید چند نکته را مد نظر قرارداد این کلاس باید مشابه کلاس اصلی تعریف شود یعنی هم به صورت partial و هم با نام کلاس اصلی User تطابق داشته باشد.
حال می توانید Scaffolding را به راحتی و بدون نگرانی بر روی کلاس ها ایجاد کنید.
با کمی تغییر بتوانید این روش را با استفاده از روش interface این کار را انجام دهید، شاید از این روش هم نیز بهتر باشد.
شیما
سلام ممنون از مطلب خوبتون
فقط یک سوال وقتی که فایل edmx ایجاد میشود که نمیتونیم یک کلاس هم نام همان کلاس برای ارتباط کلاس buddy و کلاس orm ایجا کنیم؟ داخل همان پوشه مدل باید ایجاد شود؟
اسماعیلشیدایی
با عرض سلام خدمت شما
منظور شما متوجه نشدم، یک آموزش جدید برای همین موضوع نیز بر روی وب سایت قرار داده ام می توانید از آن نیز کمک بگیرید.
موفق باشید