کلید اصلی یا Primary key چیست ؟ چگونه می توانم برای یک جدول در دیتابیس به روش کدفرست کلید اصلی قرار دهم ؟ کلید اصلی باید چه ویژگی هایی داشته باشد؟
سلام ، آرزو ابراهیمی هستم مدرس فیلم اموزش asp.net core و با یک مقاله آموزشی دیگر از فصل اموزش Entity Framework core در خدمت شما دوستان عزیز هستم.
سرفصلهای پست
Primary key یا کلید اصلی چیست ؟
قبل اینکه بریم سراغ مشخص کردن کلید اصلی جدول دیتابیس میخواهیم با مفهوم کلید اصلی یا Primary key آشنا شویم.
کلید اصلی به زبان ساده به آن ویژگی یا صفتی از موجودیت گفته میشود که منحصر فرد است. به عنوان مثال اگر هر ایرانی را به عنوان یک موجودیت در نظر بگیریم کدملی را میتوانیم به عنوان کلید اصلی برای این موجودیت در نظر بگیریم چرا که هر ایرانی کدملی منحصر به فرد خود را دارد و هیچ دو ایرانی پیدا نمیشود که کدملی آنها یکسان باشد.
قرار دادن کلید اصلی برای یک Table در روش Code First در EF Core
جهت قرار دادن کلید اصلی برای جداول در Database میتوانیم از سه روش استفاده کنیم که در ادامه این مقاله آموزشی با این سه روش آشنا خواهید شد.
اولین Property به عنوان کلید اصلی در نظر گرفته می شود.
پروژه ای که در جلسات گذشته ایجاد کردیم را باز کنید ، در کلاس Student کلید اصلی را مشخص نکردیم اما اگر به دیتابیس StudentDB مراجعه کنید متوجه خواهید شد که StudentId به عنوان کلید اصلی در نظر گرفته شده است.
چرا چنین اتفاقی افتاد؟ اگر شما خودتان کلید اصلی را مشخص نکنید به صورت خودکار اولین پراپرتی کلاس به عنوان کلید اصلی در نظر گرفته می شود و چون در کلاس Student اولین پراپرتی StudentId هست این Property به عنوان Primary key در نظر گرفته شده است.
مشخص کردن Primary key به روش Data Annotation Attributes
در این روش برای مشخص کردن کلید اصلی یا Primary key از اتریبیوت [Key()]
بالای سر آن پراپرتی که میخواهیم به عنوان کلید اصلی در نظر گرفته شود استفاده میکنیم.
به سراغ پروژه جلسه آموزشی گذشته میرویم این پروژه را باز کنید اگر یادتان باشد در جلسه آموزشی گذشته تغییر نام ستون یک Table در روش کدفرست را به شما آموزش دادم و حالا میخواهیم با استفاده از اتریبیوت Key کلید اصلی این Entity یا موجودیت را مشخص کنیم.
طبق تعریفی که از کلید اصلی خدمت شما ارائه کردم ، به نظرتون کدوم Property از کلاس Student ، کلید اصلی یا Primary key است ؟ بله درست حدس زدید پراپرتی StudentId .
چرا این Property کلید اصلی هست ؟ چون هر دانشجو ، شماره دانشجویی متفاوتی دارد و هیچ دوتا دانشجویی رو نمی توان پیدا کرد که شماره دانشجویی آنها یکسان باشد.
پس بالای سر پراپرتی StudentId از اتریبیوت Key استفاده میکنیم ، مطابق با کد زیر :
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Threading.Tasks; namespace EFCore_C05.Models { [Table("StudentMaster")] public class Student { [Key] public string StudentId { get; set; } public string NationalCode { get; set; } [Column("FirstName")] public string Name { get; set; } [Column("LastName")] public string Family { get; set; } public DateTime BirthDate { get; set; } } }
برای این که برنامه اتریبیوت Key را بشناسد باید using زیر را به بالای کلاس Student اضافه کنید.
using System.ComponentModel.DataAnnotations;
حالا کافیه دیتابیس را آپدیت کنیم بعد از آپدیت دیتابیس ، ستون StudentId به عنوان کلید اصلی یا Primary key در نظر گرفته میشود.
چنانچه با نحوه آپدیت دیتابیس در asp.net core آشنایی ندارید پیشنهاد میکنم مقاله آموزش آپدیت Database در روش CodeFirst را حتما مطالعه نمایید.
بعد از آپدیت دیتابیس ، برای مشاهده جدول دیتابیس ، MSSQL را اجرا کنید همانطور که تصویر زیر مشاهده میکنید کلید اصلی یا Primary key با علامت کلید مشخص شده است.
مشخص کردن Primary key به روش Fluent API
با استفاده از روش Fluent API که در مقاله آموزشی پیکربندی کلاس های Domain در Code First با آن آشنا شدید هم میتوانید کلید اصلی یا Primary key را مشخص کنید.
ابتدا باید متد OnModelCreating را در کلاس Override ، StudentDBContext کنید سپس داخل این متد از کدهای زیر استفاده نمایید.
builder.Entity<Student>().HasKey(b => b.StudentId);
در کد بالا برای مشخص کردن کلید اصلی از متد HasKey()
استفاده کرده ایم و سپس در کد b => b.StudentId
پراپرتی کلید اصلی را مشخص کردیم.
پس متد OnModelCreating پس از تغییر به صورت زیر خواهد شد.
protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); builder.Entity<Student>().ToTable("StudentMaster"); builder.Entity<Student>().Property(b => b.Name).HasColumnName("FirstName"); builder.Entity<Student>().Property(b => b.Family).HasColumnName("LastName"); builder.Entity<Student>().HasKey(b => b.StudentId); }
در صورتی که بخواهیم کدنویسی کوتاه تری داشته باشیم میتوانیم بعد از متد ToTable از متد HasKey استفاده کنیم همانند کد زیر :
builder.Entity<Student>().ToTable("StudentMaster").HasKey(b => b.StudentId);
دوستان این مقاله آموزشی هم به پایان رسید سوالی ، انتقادی ، پیشنهادی داشتید حتما در قسمت نظرات ارسال کنید پاسخگوی شما دوستان خواهم بود.
3 پاسخ
خب این مقاله درست الام اگه جدول من ارتباط یک به یک با خودش داشنه باشه چی ؟ اونوقت باید چی کار کنیم که درست بشه خودش که تشخیص نمیده ؟
سلام آیا میشه در یک جدول sql server دو کلید اصلی داشت. برای مثال توی عکسی که آپلود کردم، در پروژه ای مشاهده کردم که ظاهرا میشه این کار را کرد؟ ممنون میشم یک توضیح در مورد این دهید چون زیاد برخورد کردم با این عنوان که در جدول هایمان بیش از یک کلید اصلی نمی توان داشت !
ممنون
سلام وقتتون بخیر
بله میشه دوتا کلید قرار بدید در واقع این دوتا کلید هر کدوم به تنهایی کلید خارجی هم هستند.
حالا شما در EF Core با استفاده از Fluent API می تونید این مورد رو پیاده سازی کنید.