دوره آموزشی Entity FrameWork Core - قسمت هشتم
پراپرتی های سایه یا shadow property پراپرتی هایی هستند که مستقیما در کلاس موجودیت دات نت شما تعریف نشده اند اما برای آن entity type در مدل EF Core گنجانده شده اند(به ستون های پایگاه داده نگاشت
می شوند.) مقدار و وضعیت این پراپرتی ها صرفاً در Change Tracker حفظ می شود. shadow propertyها زمانی مفید هستند که دادههایی در پایگاه داده وجود داشته باشد که نباید در entity typeهای map شده در معرض دید قرار گیرند.
پراپرتی های سایه در تعدادی از سناریوها مفید هستند. به عنوان مثال، آنها می توانند برای توسعه مدلی استفاده شوند که در آن شما به source code کلاس های موجودیت دسترسی ندارید. همچنین میتوانند در مواردی استفاده شوند که ترجیح میدهید تعاریف کلاس موجودیتهای شما شامل «relational artifacts» مانند ستونهای کلید خارجی یا ویژگیهای metadata مانند DateCreated یا LastUpdated یا پراپرتی rowversion نباشد.
هنگامی که نمی خواهید ویژگی کلید خارجی را در معرض دید قرار دهید و می خواهید فقط با استفاده از پراپرتی های ناوبری رابطه را مدیریت کنید. پراپرتی کلید خارجی، پراپرتی سایه خواهد بود و به ستون پایگاه داده نگاشت می شود، اما به عنوان پراپرتی یک موجودیت در معرض نمایش قرار نمی گیرد. (طبق قرارداد در EF Core، اگر پراپرتی کلید خارجی را در کلاسهای entity تعریف نکنید، به طور خودکار پراپرتیshadow را برای آن ایجاد میکند. نیازی نیست پراپرتی کلید خارجی را به صورت دستی پیکربندی کنید.)
این پراپرتی <navigation property name><principal key property name>
نامیده می شود (برای نامگذاری از مسیریابی موجودیت وابسته که به موجودیت اصلی اشاره می کند استفاده می شود). اگر نام پراپرتی کلید اصلی شامل نام پراپرتی ناوبری باشد، نام فقط <principal key property name>
خواهد بود. اگر پراپرتی ناوبری در موجودیت وابسته وجود نداشته باشد، نام نوع اصلی به جای آن استفاده می شود.
به عنوان مثال، کد زیر منجر به معرفی یک پراپرتی سایه BlogId به موجودیت Post می شود:
internal class MyContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List<Post> Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } // Since there is no CLR property which holds the foreign // key for this relationship, a shadow property is created. public Blog Blog { get; set; } }
می توانید از Fluent API برای پیکربندی پراپرتی های سایه استفاده کنید. در نمونه زیر، از آنجایی که Blog هیچ خاصیت CLR به نام LastUpdated ندارد، یک ویژگی سایه ایجاد می شود:
internal class MyContext : DbContext { public DbSet<Blog> Blogs { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property<DateTime>("LastUpdated"); } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } }
اگر نام ارائه شده به متد Property با نام یک پراپرتی موجود مطابقت داشته باشد (یک پراپرتی سایه یا یک پراپرتی تعریف شده در کلاس موجودیت)، آنگاه EF Core به جای معرفی یک پراپرتی سایه جدید، آن پراپرتی موجود را پیکربندی می کند.
مقادیر پراپرتی Shadow را می توان از طریق ChangeTracker API بدست آورد و تغییر داد:
context.Entry(myBlog).Property("LastUpdated").CurrentValue = DateTime.Now;
پراپرتی های سایه را می توان در کوئری های LINQ از طریق متد استاتیک EF.Property ارجاع داد:
var blogs = context.Blogs
.OrderBy(b => EF.Property<DateTime>(b, "LastUpdated"));
ویژگی های سایه پس از یک پرس و جو no-tracking قابل دسترسی نیستند زیرا موجودیت های بازگردانده شده توسط change tracker ردیابی نمی شوند.
بيشتر بخوانيد : دوره آموزشی Entity FrameWork Core - قسمت دهم
بیشتر بخوانید : دوره آموزشی Entity FrameWork Core
بیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Core