دوره آموزشی Entity FrameWork Core - قسمت هفتم

دوره آموزشی Entity FrameWork Core - قسمت ششمستون های پایگاه داده می توانند مقادیر خود را به روش های مختلفی تولید کنند. ستون های کلید اولیه اغلب اعداد صحیحی هستند که به طور خودکار افزایش می یابند، سایر ستون ها دارای مقادیر پیش فرض(default) یا محاسبه شده(computed) هستند، و غیره.در این قسمت الگوهای مختلفی را برای پیکربندی تولید مقادیر با EF Core مرور می کنیم.تولید مقدار پیش فرض برای ستون ها (Default values) : در پایگاه داده های رابطه ای، یک ستون را می توان با یک مقدار پیش فرض پیکربندی کرد. اگر یک ردیف بدون مقدار برای آن ستون درج شود، از مقدار پیش فرض استفاده می شود.شما می توانید یک مقدار پیش فرض را در برای یک پراپرتی پیکربندی کنید:با استفاده از Fluent API :protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property(b => b.Rating) .HasDefaultValue(3); }همچنین می توانید از یک تابع در SQL که برای محاسبه مقدار پیش فرض استفاده می شود استفاده کنید:protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property(b => b.Created) .HasDefaultValueSql(&quotgetdate()&quot); }تولید مقدار برای ستون های محاسباتی(Computed columns) :در اکثر پایگاه های داده رابطه ای، یک ستون را می توان به گونه ای پیکربندی کرد که مقدار آن در پایگاه داده محاسبه شود، معمولاً با عبارتی(expression) که به ستون های دیگر اشاره می کند:modelBuilder.Entity<Person>() .Property(p => p.DisplayName) .HasComputedColumnSql(&quot[LastName] + ', ' + [FirstName]&quot);مورد بالا یک ستون محاسبه شده مجازی ایجاد می کند که هر بار که از پایگاه داده واکشی می شود مقدار آن محاسبه می شود. همچنین می‌توانید تعیین کنید که یک ستون محاسبه‌شده ذخیره شود (گاهی اوقات به نام persisted)، به این معنی که در هر به‌روزرسانی ردیف محاسبه می‌شود و در کنار ستون‌های معمولی روی دیسک ذخیره می‌شود: ایجاد ستون های محاسباتی ذخیره شده در EF Core 5.0 اضافه شد.modelBuilder.Entity<Person>() .Property(p => p.NameLength) .HasComputedColumnSql(&quotLEN([LastName]) + LEN([FirstName])&quot, stored: true);تولید مقدار برای کلید های اصلی (Primary keys) : طبق قرارداد، کلیدهای اولیه غیر ترکیبی از نوع short، int، long یا Guid به گونه‌ای تنظیم می‌شوند که اگر مقداری توسط برنامه ارائه نشده باشد، مقادیری برای موجودیت‌های درج شده تولید می‌شوند. ارائه دهنده پایگاه داده شما معمولاً از پیکربندی لازم مراقبت می کند. به عنوان مثال، یک کلید اولیه عددی در SQL Server به طور خودکار به عنوان یک ستون IDENTITY تنظیم می شود.پیکربندی صریح برای تولید مقادیر ستون ها : در بالا دیدیم که EF Core به طور خودکار تولید مقدار را برای کلیدهای اصلی تنظیم می کند - اما ممکن است بخواهیم همین کار را برای پراپرتی های غیر کلیدی انجام دهیم. شما می توانید هر پراپرتی را طوری پیکربندی کنید که مقدار آن برای موجودیت های درج شده به صورت زیر تولید شود:با استفاده از Data annotation :public class Blog { public int BlogId { get; set; } public string Url { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public DateTime Inserted { get; set; } }با استفاده از Fluent API :protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property(b => b.Inserted) .ValueGeneratedOnAdd(); }به طور مشابه، یک پراپرتی را می توان به گونه ای پیکربندی کرد که مقدار آن در هنگام افزودن یا به روز رسانی تولید شود:با استفاده از Data annotation :public class Blog { public int BlogId { get; set; } public string Url { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime LastUpdated { get; set; } }با استفاده از Fluent API :protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity<Blog>() .Property(b => b.LastUpdated) .ValueGeneratedOnAddOrUpdate(); }توجه داشته باشید برخلاف مقادیر پیش‌فرض یا ستون‌های محاسبه‌شده، ما نحوه تولید مقادیر را مشخص نمی‌کنیم. این بستگی به ارائه دهنده پایگاه داده مورد استفاده دارد. ارائه دهندگان پایگاه داده ممکن است به طور خودکار تولید مقدار را برای برخی از انواع پراپرتی تنظیم کنند، اما برخی دیگر ممکن است از شما بخواهند که به صورت دستی نحوه تولید مقدار را تنظیم کنید.به عنوان مثال، در SQL Server، هنگامی که یک ویژگی GUID به عنوان مقدار تولید شده در هنگام add یک رکورد پیکربندی می شود، ارائه دهنده به طور خودکار تولید مقدار را در سمت client انجام می دهد، با استفاده از یک الگوریتم برای تولید مقادیر متوالی GUID بهینه. با این حال، تعیین ValueGeneratedOnAdd بر روی یک پراپرتی DateTime تأثیری نخواهد داشت.بسته به ارائه دهنده پایگاه داده مورد استفاده، مقادیر ممکن است در سمت client توسط EF یا در پایگاه داده تولید شوند. اگر مقدار توسط پایگاه داده تولید شده باشد، EF ممکن است زمانی که موجودیت را به context اضافه می‌کنید، یک مقدار موقت به آن اختصاص دهد. سپس این مقدار موقت با مقدار پایگاه داده تولید شده در طی ()SaveChanges جایگزین می شود. تولید مقدار Date/time :یک روش متداول این است که یک ستون پایگاه داده داشته باشیم که حاوی Date/time برای اولین درج ستون (مقدار ایجاد شده در هنگام insert) یا آخرین به روز رسانی آن (مقدار ایجاد شده در insert یا update) باشد. از آنجایی که استراتژی‌های مختلفی برای انجام این کار وجود دارد، ارائه‌دهندگان EF Core معمولاً تولید مقدار را به‌طور خودکار برای ستون‌های Date/time تنظیم نمی‌کنند - شما باید خودتان آن را پیکربندی کنید.با استفاده از Fluent API :protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property(b => b.Created) .HasDefaultValueSql(&quotgetdate()&quot); }حتماً تابع مناسب را انتخاب کنید، زیرا ممکن است چندین تابع وجود داشته باشد (به عنوان مثال () GETDATE در مقابل ()GETUTCDATE).اگرچه ستون‌های محاسبه‌شده ذخیره‌شده راه‌حل خوبی برای مدیریت timestamp آخرین به‌روزرسانی‌شده به نظر می‌رسند، پایگاه‌های داده معمولاً اجازه تعیین توابع مانند GETDATE() را در یک ستون محاسبه‌شده نمی‌دهند. به عنوان یک جایگزین، می توانید یک تریگر پایگاه داده را برای دستیابی به همان اثر تنظیم کنید:CREATE TRIGGER [dbo].[Blogs_UPDATE] ON [dbo].[Blogs] AFTER UPDATE AS BEGIN SET NOCOUNT ON; IF ((SELECT TRIGGER_NESTLEVEL()) > 1) RETURN; DECLARE @Id INT SELECT @Id = INSERTED.BlogId FROM INSERTED UPDATE dbo.Blogs SET LastUpdated = GETDATE() WHERE BlogId = @Id ENDغیر فعال کردن تولید مقدار :در برخی موارد ممکن است بخواهید تولید مقدار را که طبق قرارداد تنظیم شده است غیرفعال کنید. به عنوان مثال، یک کلید اولیه از نوع int معمولاً به طور ضمنی به عنوان مقدار تولید شده-در-Insert پیکربندی می شود (به عنوان مثال ستون identity در SQL Server). شما می توانید این را از طریق موارد زیر غیرفعال کنید:با استفاده از Data annotation :public class Blog{ [DatabaseGenerated(DatabaseGeneratedOption.None)] public int BlogId { get; set; } public string Url { get; set; } }با استفاده از Fluent API :protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property(b => b.BlogId) .ValueGeneratedNever(); }بیشتر بخوانید : دوره آموزشی Entity FrameWork Core - قسمت هشتمبیشتر بخوانید : دوره آموزشی Entity FrameWork Coreبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi