فرشید عزیزی
فرشید عزیزی
خواندن ۵ دقیقه·۲ سال پیش

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

یک کلید به عنوان یک شناسه منحصر به فرد برای هر نمونه موجودیت(entity instance) عمل می کند. اکثر موجودیتها در EF دارای یک کلید واحد(single key) هستند که با مفهوم کلید اولیه(primary key) در پایگاه داده های رابطه ای نگاشت(map) می شود.


پیکربندی کلید اصلی(Configuring a primary key) :

طبق قرارداد، یک ویژگی با نام Id یا <type name<Id به عنوان کلید اصلی یک موجودیت پیکربندی می شود.

internal class Car { public string Id { get; set; } public string Make { get; set; } public string Model { get; set; } } internal class Truck { public string TruckId { get; set; } public string Make { get; set; } public string Model { get; set; } }

شما می توانید یک ویژگی را به عنوان کلید اصلی یک موجودیت به صورت زیر پیکربندی کنید:

  • با استفاده از Data annotation :
internal class Car { [Key] public string LicensePlate { get; set; } public string Make { get; set; } public string Model { get; set; } }
  • با استفاده از Fluent API :
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Car>() .HasKey(c => c.LicensePlate); }

شما همچنین می توانید چندین پراپرتی را به عنوان کلید یک موجودیت پیکربندی کنید - این به عنوان یک کلید ترکیبی(composite key) شناخته می شود. کلیدهای ترکیبی را فقط می توان با استفاده از Fluent API پیکربندی کرد. قراردادها هرگز یک کلید ترکیبی را تنظیم نمی کنند، و شما نمی توانید از Annotations برای پیکربندی آن استفاده کنید.

protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Car>() .HasKey(c => new { c.State, c.LicensePlate }); }


تولید مقدار برای کلید اصلی(Value generation) :

برای کلیدهای اصلی غیر ترکیبی، عددی و GUID در EF Core تولید مقدار آن بر اساس قرارداد تنظیم می شود. به عنوان مثال، یک کلید اولیه عددی در SQL Server به طور خودکار به عنوان یک ستون IDENTITY تنظیم
می شود.


نام کلید اصلی(Primary key name) :

طبق قرارداد، در پایگاه های داده رابطه ای کلیدهای اولیه با نام <PK_<type name ایجاد می شوند. شما می توانید نام کلید اصلی را به صورت زیر پیکربندی کنید:

protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .HasKey(b => b.BlogId) .HasName(&quotPrimaryKey_BlogId&quot); }

کلیدهای جایگزین (Alternate Keys) :

یک کلید جایگزین(Alternate Key) به عنوان یک شناسه منحصر به فرد جایگزین، برای هر نمونه موجودیت علاوه بر کلید اصلی عمل می کند. می توان از آن به عنوان هدف یک رابطه استفاده کرد. هنگام استفاده از یک پایگاه داده رابطه‌ای، این نگاشت به مفهوم unique index/constraint و foreign key constraint اشاره می‌کند.

اگر فقط می خواهید منحصر به فرد بودن یک ستون را اعمال کنید(unique index/constraint)، به جای یک کلید جایگزین، یک شاخص منحصر به فرد(unique index) تعریف کنید. در EF، کلیدهای جایگزین فقط خواندنی هستند و معنای بیشتری را روی Index های منحصر به فرد ارائه می دهند زیرا می توانند به عنوان هدف یک کلید خارجی(رابطه) استفاده شوند.

کلیدهای جایگزین معمولاً در صورت نیاز برای شما معرفی می شوند و نیازی به پیکربندی دستی آنها ندارید. طبق قرارداد، هنگامی که یک ویژگی را که کلید اصلی نیست به عنوان هدف یک رابطه شناسایی می کنید، یک کلید جایگزین برای شما معرفی می شود.

آیا با مفهوم constraint آشنایی دارید ؟
Constraint ها در در یک پایگاه داده رابطه ای مانند sql server ، برای محدود کردن نوع داده هایی که میتواند در جدول تعریف شود مورد استفاده قرار میگیرد.این محدودیت ها را زمانی که یک جدول جدید ایجاد میکنیم یا زمانی که نوع داده ای جدول را تغییر میدهیم بایستی در نظر داشته باشیم.
Constraint های sql شامل موارد زیر میشوند :
* NOT NULL(مشخص میکند که فیلد، مقادیر null را نمی پذیرد .)
* UNIQUE(مقدار فیلد می بایست در تمامی رکورد های یک جدول منحصر به فرد باشد.)
* PRIMARY KEY(کلید اصلی یک constraint است هیچ دو رکوردی در جدول دارای مقدار یکسان در کلید اصلی نیستند .)
* FOREIGN KEY(رابطه بین جداول را مشخص می کند هنگامی که رابطه والد و فرزندی بین رکورد های دو جدول برقرار است foreign key constraint اجاره نمیدهد رکورد والدی حذف شود که دارای فرزند است و یا اینکه رکورد فرزندی درج شود بدون اینکه فاقد کلید اصلی والد خود باشد.)
* CHECK(جهت محدود کردن مقادیر ورودی در فیلد.)
* DEFAULT(تعیین مقدار پیشفرض برای فیلد. اگر مقداری در فیلد وارد نشود این مقدار بصورت خودکار در فیلد درج می شود)


internal class MyContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Post>() .HasOne(p => p.Blog) .WithMany(b => b.Posts) .HasForeignKey(p => p.BlogUrl) .HasPrincipalKey(b => b.Url); } } 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; } public string BlogUrl { get; set; } public Blog Blog { get; set; } }

همچنین می توانید یک پراپرتی را به عنوان کلید جایگزین پیکربندی کنید:

به مثال ابتدای پست برگردید و آن را مرور کنید

با استفاده از Fluent API :

protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Car>() .HasAlternateKey(c => c.LicensePlate); }

همچنین می توانید چندین پراپرتی را به عنوان یک کلید جایگزین پیکربندی کنید (که به عنوان کلید جایگزین ترکیبی شناخته می شود):

protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Car>() .HasAlternateKey(c => new { c.State, c.LicensePlate }); }

در نهایت، طبق قرارداد، ایندکس و محدودیتی که برای یک کلید جایگزین معرفی می‌شود،
<AK_<type name>_<property name
نامیده می‌شود (برای کلیدهای جایگزین ترکیبی <property name> به فهرستی از نام‌های پراپرتی جدا شده از زیر خط تبدیل می‌شود). می توانید نام شاخص کلید جایگزین و محدودیت منحصر به فرد را پیکربندی کنید:

protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Car>() .HasAlternateKey(c => c.LicensePlate) .HasName(&quotAlternateKey_LicensePlate&quot); }


بیشتر بخوانید : دوره آموزشی Entity FrameWork Core - قسمت هفتم

بیشتر بخوانید : دوره آموزشی Entity FrameWork Core

بیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Core

https://zarinp.al/farshidazizi

sql serverentity framework coreef coreasp net coreدوره آموزشی
Software Engineer
شاید از این پست‌ها خوشتان بیاید