رابطه ی یک به یک با استفاده از Code First در Entity Framework
شنبه 10 بهمن 1394در این مقاله می خواهیم با تنظیم رابطه ی یک به یک در Entity بتوانیم از الگوی code first استفاده نماییم، همان طور که می دانید 3 روش موجود است برای ثبت داده ها code first-database first-model first است.
ارتباط بین جداول با استفاده از کلید خارجی در پایگاه داده رابطه ای تعریف شده است، کلید خارجی یک ستون یا ترکیبی از ستون که در اجرای ارتباط بین داده ها از دو جدول است، 3 نوع از روابط وجود دارد:
1-یک به یک
2-یک به چند یا چند به یک
3-چند به چند
همه ی این نوع رابطه ها با استفاده از entity framework با استفاده از الگوی code first انجام می پذیرد، در این مقاله ما می توانیم با استفاده از رابطه ی یک به یک اطلاعات را نمایش دهیم.
رابطه ی یک به یک زمانی اتفاق می افتد که کلید اصلی یک جدول کلید خارجی جدول دیگر باشد.
entityframework مجبور است کلید اصلی از یک جدول را در جدول دوم به عنوان کلید خارجی برای ایجاد رابطه در نظر بگیرد، در این رابطه یک رکورد در طرف جدول قرار می گیرد.
مفهوم رابطه ی یک به یک:
با استفاده از یک نمونه مفهوم رابطه ی یک به یک را توضیح می دهیم، ما دو موجودیت داریم ، Employee و EmployeeDetails یک Employee فقط یک رکورد را ثبت می نماید، در اینجا EmployeeID کلید اصلی یک جدول است و در جدول جزئیات کارمندان آن کلید اصلی یه عنوان کلید خارجی محسوب می شود.
از طریق یک رابطه می توانیم به چندین اطلاعات از یک جدول دسترسی پیدا نماییم.
ما اینجا دو راه برای تنظیم یک به یک رابطه بین دو موجودیت داریم.
1- استفاده از DataAnnotation:
EF یک سری dataannotation را برای یک سری خصوصیت می تواند تنظیم نماید، ForeignKey کلید خارجی را برای صفت مشخص می نماید، یک رابطه در EF همیشه با دو موجودیت بر قرار بوده است، اگر ما چندین رابطه بین دو موجودیت داشته باشیم EF نمی تواند رابطه ی ما را کنترل نماید.
نمونه کلاس Employee:
[Table("Employee")] public partial class Employee { [DatabaseGenerated(DatabaseGeneratedOption.None)] public int EmployeeId { get; set; } [Required] [StringLength(50)] public string FirstName { get; set; } [Required] [StringLength(50)] public string LastName { get; set; } [StringLength(50)] public string MiddleName { get; set; } public virtual EmployeeDetail { get; set; } }
نمونه کلاس EmployeeDetails:
[Table("EmployeeDetail")] public partial class EmployeeDetail { [Key, ForeignKey("Employee")] [DatabaseGenerated(DatabaseGeneratedOption.None)] public int EmployeeId { get; set; } [StringLength(10)] public string Gender { get; set; } [StringLength(255)] public string EmailAddress { get; set; } [StringLength(50)] public string PhoneNumber { get; set; } public virtual EmployeeEmployee { get; set; } }
کلاس EntityContex:
public partial class EFTestModel: DbContext { public EFTestModel(): base("name=entities") {} public virtualDbSet < Employee > Employees { get; set; } public virtual DbSet < EmployeeDetail > EmployeeDetails { get; set; } protected override void OnModelCreating(DbModelBuildermodelBuilder) {} }
در نمونه کد بالا دو کلاس تعریف شده است که یک رابطه ی یک به یک دارند، در کلاس بالا EmployeeID کلید اصلی و در کلاس جزئیات کارمندان به عنوان کلید خارجی محسوب خواهد شد، رابطه ی code first یک رابطه ی یک به یک را بین کارمندان و جزئیات کارمندان با استفاده از صفت dataannotations ایجاد می نماید.
در مدل بالا ، ما یک consoleapplication برای دریافت اطلاعات و نمایش اطلاعات کارمندان استفاده کرده ایم.
static void Main(string[] args) { //Configure One to One Relationship in Entity Framework Using Code First Approach Employee employee; using(var context = newEntityModel.EFTestModel()) { employee = context.Employees.FirstOrDefault(); Console.WriteLine("Employee Details"); Console.WriteLine("Employee Name:" + string.Join(" ", newobject[] { employee.FirstName, employee.LastName })); Console.WriteLine("Employee Email Address:" + employee.EmployeeDetail.EmailAddress); } Console.ReadLine(); }
برای قراردادهای کلید اصلی و کلید خارجی در روش code first ما از FluentAPI و یا از HashKey استفاده می نماییم، ما می توانیم کلید اصلی را با استفاده از دو متد HasOptional و WithRequired که با استفاده از این دو متد می توانیم کلید خارجی را برای کلاس مورد نظر تعریف نماییم.
ما می توانیم یک رابطه ی یک به یک را بین Employee و EmployeeDetails با استفاده از FluentAPI تعریف نماییم که کد آن به صورت زیر خواهد بود:
protected override void OnModelCreating(DbModelBuildermodelBuilder) { modelBuilder.Entity < Customer > ().HasKey(p => p.CustomerId); modelBuilder.Entity < Customer > ().HasOptional(e => e.CustomerDetail).WithRequired(e => e.Customer); }
کلاسی که برای customer و customerdetails تعریف شده است به صورت زیر است:
[Table("Customer")] public partial class Customer { [DatabaseGenerated(DatabaseGeneratedOption.None)] public int CustomerId { get; set; } [Required] [StringLength(50)] public string FirstName { get; set; } [Required] [StringLength(50)] public string LastName { get; set; } [StringLength(50)] public string MiddleName { get; set; } public virtual CustomerDetailCustomerDetail { get; set; } } [Table("CustomerDetail")] public partial class CustomerDetail { [Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public int CustomerId { get; set; } [StringLength(255)] public string EmailAddress { get; set; } [StringLength(50)] public string PhoneNumber { get; set; } public virtual CustomerCustomer { get; set; } }
برای تست ما از یک console استفاده می کنیم که اطلاعات کارمندان را نمایش می دهد.داخل کلاس program به صورت زیر خواهد بود:
static void Main(string[] args) { //Configure One to One Relationship in Entity Framework Using Code First Approach Customer c; using(var context = newEntityModel.EFTestModel()) { c = context.Customers.FirstOrDefault(); Console.WriteLine("Customer Details"); Console.WriteLine("Customer Name:" + string.Join(" ", newobject[] { c.FirstName, c.LastName })); Console.WriteLine("Customer Email Address:" + c.CustomerDetail.EmailAddress); } Console.ReadLine(); }
خروجی به صورت زیر خواهد بود:
- C#.net
- 3k بازدید
- 4 تشکر