به طور کلی دو نوع Entity در Entity Framework وجود دارد. POCO Entity ها و Dynamic Proxy Entity ها. در ادامه به بررسی این دو نوع Entity ها خواهیم پرداخت.
معنای POCO Entity ها
کلمه ی POCO سر نام Plain Old CLR Object است. این نوع از Entity ها کلاس هایی هستند که به هیچ کلاس خاصی از دات نت فریم ورک وابستگی ندارد. این نوع از Entity ها شبیه هر کلاس ساده CLR دیگر در دات نت که به آن کلاس های POCO نیز می گویند می باشد. این POCO Entity ها که از آنها تحت عنوان Persistence-ignorant Object هم یاد میشود (اشیایی که به نحوه ذخیره سازی داده ها روی بانک اطلاعاتی بی اهمیت هستند) همان عملیات Query و Update و Insert و Delete را که Entity Type های تولید شده توسط Entity Data Model مدل پشتیبانی میشوند را پشتیبانی می کنند. در ادامه یک POCO Entity با نام Student را مشاهده می کنید.
public class Student
{
public int StudentID { get; set; }
public string StudentName { get; set; }
public DateTime? DateOfBirth { get; set; }
public byte[] Photo { get; set; }
public decimal Height { get; set; }
public float Weight { get; set; }
public StudentAddress StudentAddress { get; set; }
public Grade Grade { get; set; }
}
Dynamic Proxy Entity ها
وDynamic Proxy Entity ها کلاس های پروکسی هستندکه در زمان Runtime ایجاد میشوند و به عنوان یک Wrapper برای POCO Entity ها در نظر گرفته می شوند. Dynamic Proxy Entity ها امکان ایجاد کردن تکنیک Lazy Loading را فراهم میکنند. دقت کنید که Dynamic Proxy Entity ها فقط در Entity Framework 6 پشتیبانی می شوند. برای اینکه یک POCO Entity تبدیل به یک Dynamic Proxy Entity شود باید شرایط زیر را داشته باشد:
- باید به صورت Public تعریف شود.
- نباید Sealed باشد.
- نباید Abstract باشد.
- هر Reference Navigation Property ی درون آن باید به صورت Public و Virtual تعریف شود.
- هر Collection Navigation Property در آن باید به صورت ICollection پیادهسازی شود.
- در کلاس Context گزینه ی ProxyCreationeEnabled نباید مقدار False داشته باشد. دقت کنید که مقدار پیش فرض True است.
در ادامه POCO Entity ای را میبینید که تمامی شرایط بالا را فراهم کرده بنابراین در زمان Runtime به یک Dynamic Proxy Entity تبدیل می شود.
public class Student
{
public int StudentID { get; set; }
public string StudentName { get; set; }
public DateTime? DateOfBirth { get; set; }
public byte[] Photo { get; set; }
public decimal Height { get; set; }
public float Weight { get; set; }
public virtual StudentAddress StudentAddress { get; set; }
public virtual Grade Grade { get; set; }
}
دقت کنید که به طور پیش فرض یک Dynamic Proxy برای تمامی Entity ها در نظر گرفته می شود اما شما میتوانید با context.Configuration.ProxyCreationEnabled = false; در کلاس Context این قضیه را لغو کنید.
در ضمن API مربوط به Entity Framework در زمان Runtime یک Dynamic Entity را برای Entity تعریف شده در قسمت بالا ایجاد میکنند. Data Type این Dynamic Entity برای Student تحت نام System.Data.Entity.DynamicProxies.Student شناخته میشود. تصویر زیر این موضوع را به نمایش گذاشته است.
برای به دست آوردن Data Type کلاس Dynamic Proxy Entity از متد ObjectContext.GetObjectType() استفاده می کنیم. تصویر زیر این موضوع را نشان می دهد.
پرووید: مرکز آموزش تخصصی برنامه نویسی و توسعه نرم افزار