۲۴-آبان-۱۳۹۲, ۱۳:۲۵:۰۴
فرض کنید در روش EF Database First میخواهید فیلدی به مدل اضافه شود که در دیتابیس وجود ندارد، درواقع فیلدی محاسباتی به مدل اضافه کنید.راه حل چیست؟ اولین روشی که ممکن است به ذهن برسد این است که به کلاس مدل که از جدول دیتابیس ساخته شده، فیلدی محاسباتی اضافه میکنیم.
به نظر راه حل درستی میرسد، اما مشکل این روش چیست؟
اگر مدل برنامه از روی دیتابیس بروزشود، چه اتفاقی میافتد؟
خب قاعدتا این فیلد محاسباتی از دست میرود و باید دوباره آن را به کلاس مدل جدید و بروز شده اضافه کنیم. که به نظر راه حل منطقی و خوبی نمیرسد. در چنین مواقعی میتوان به جای اینکه این پراپرتی را به کلاس تولید شده از روی دیتابیس اضافه کرد، این فیلد را به یک Partial Class از کلاس تولید شده که درهمان پروژه و فضای نام کلاس تولید شده از دیتابیس قراردارد، اضافه کرد. به این ترتیب با هر بار بروز شدن مدل از روی دیتابیس، این فیلد از بین نمیرود.
اما این روش محدودیت هایی نیز دارد :
1. همه قسمتهای Partial Class باید در یک اسمبلی باشند.
2. پراپرتیهای درون Partial Class در دیتابیس ذخیره نمیشوند.
3. ونیز این پراپرتیها در عبارات Linq قابل استفاده نیستند.چون عبارت Linq در نهایت به یک رشته SQL تبدیل شده و در دیتابیس اجرا میشود.البته با فرض این که دیتاپرووایدر، SQL باشد.
کد:
public class Person
{
public string FullName {
get
{
return FirstName + " " + LastName;
}
}
}
اگر مدل برنامه از روی دیتابیس بروزشود، چه اتفاقی میافتد؟
خب قاعدتا این فیلد محاسباتی از دست میرود و باید دوباره آن را به کلاس مدل جدید و بروز شده اضافه کنیم. که به نظر راه حل منطقی و خوبی نمیرسد. در چنین مواقعی میتوان به جای اینکه این پراپرتی را به کلاس تولید شده از روی دیتابیس اضافه کرد، این فیلد را به یک Partial Class از کلاس تولید شده که درهمان پروژه و فضای نام کلاس تولید شده از دیتابیس قراردارد، اضافه کرد. به این ترتیب با هر بار بروز شدن مدل از روی دیتابیس، این فیلد از بین نمیرود.
کد:
public partial class Person
{
public string FirstName {get; set;}
public string LastName {get; set; }
}
public partial class Person
{
public string FullName {
get
{
return FirstName + " " + LastName;
}
}
}
اما این روش محدودیت هایی نیز دارد :
1. همه قسمتهای Partial Class باید در یک اسمبلی باشند.
2. پراپرتیهای درون Partial Class در دیتابیس ذخیره نمیشوند.
3. ونیز این پراپرتیها در عبارات Linq قابل استفاده نیستند.چون عبارت Linq در نهایت به یک رشته SQL تبدیل شده و در دیتابیس اجرا میشود.البته با فرض این که دیتاپرووایدر، SQL باشد.