آموزش رابطه یک به یک در EF Codefirst
با عرض سلام خدمت تمامی علاقمندان به مباحث آموزش طراحی سایت با ASP.NET MVC ، در این مقاله آموزشی قصد داریم تا شما را با نحوه پیکربندی رابطه یک به یک به روش EF Codefirst آشنا نماییم پس تا انتهای این مقاله آموزشی با ما همراه باشید.
فرض کنید که میخواهیم در دیتابیس یک جدول برای درج اطلاعات شخصی یک دانش آموز و یک جدول برای درج اطلاعات مربوط به محل سکونت او ایجاد نماییم برای ایجاد رابطه یک به یک بین این دو جدول باید کلید اصلی (Primary Key) جدول اطلاعات شخصی هم به عنوان کلید اصلی و هم به عنوان کلید خارجی (ForeignKey) جدول اطلاعات محل سکونت در نظر گرفته شود. همانند تصویر زیر:
پیکربندی رابطه یک به یک با Data Annotation ها
همانطور که میدانید در روش EF Codefirst برای هر جدول یک کلاس تعریف می شود و نوع داده های جدول ، تعریف کلید اصلی و خارجی ، و ارتباط بین جداول توسط Data Annotation ها انجام می شود. در این مقاله آموزشی ما به شما طریقه پیکربندی رابطه یک به یک به روش EF Codefirst را آموزش خواهیم داد. در گام نخست ابتدا در پوشه Model یک کلاس با نام دلخواه ایجاد نموده و سپس کلاس های جدول Student و StudentAddress را در آن بنویسید .
کلاس Student (جدول اطلاعات شخصی)
public class Student { [Key] public int Id { get; set; } public string StudentName { get; set; } public virtual StudentAddress Address { get; set; } }
کلاس StudentAddress (جدول اطلاعات محل سکونت)
public class StudentAddress { [Key, ForeignKey("Student")] public int StudentId { get; set; } public string Address1 { get; set; } public string Address2 { get; set; } public string City { get; set; } public int Zipcode { get; set; } public string State { get; set; } public string Country { get; set; } public virtual Student Student { get; set; } }
ایجاد کلاس Context برای ساخت دیتابیس
در گام آخر در پوشه ی Model یک کلاس جهت ایجاد کلاس Context به پرژه خود اضافه نمایید ما نام کلاس Context خود را OneToOneContext قرار داده ایم که در تکه کد زیر مشخص است شما به جای نام OneToOneContext نام کلاس Context خود را قرار دهید.
using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Web; namespace OneToOne.Models { public class OneToOneContext : DbContext { public OneToOneContext() : base("name=DefaultConnection") { } public DbSet<Student> Students { get; set; } public DbSet<StudentAddress> StudentAddress { get; set; } } }
به همین راحتی شما توانستید یک رابطه یک به یک بین جداول خود در دیتابیس ایجاد نمایید در صورتی که پیرامون این مقاله و سایر مقالات آموزشی ASP.NET MVC سوالی داشتید حتما سوال خود را در نظرات سایت میزفا ارسال نمایید.
8 پاسخ
سلام و درود برشما من یک سوالی داشتم که نمیتونم حلش کنم
فرض کنید شما یک سایت موزیک دارید یک سایت موزیک دارای خواننده – آلبوم و خود موزیک هستش
یک خواننده میتونه nتا آلبوم و nتا موزیک داشته باشه
یک آلبوم میتونه یک خواننده داشته باشه – n تا موزیک داشته باشه
یک موزیک میتونه یک خواننده و یک آلبوم داشته باشه!
همچین دیتابیسی رو چطوری میتونم بسازم! با کد فرست میشه؟
لطفا کمکم کنید ممنون میشم
سلام وقتتون بخیر
یک جدول برای خوانندگان باید در نظر بگیرید
یک جدول برای البوم ها که ایدی خواننده به عنوان کلید خارجی این جدول هست و خود جدول یک کلید اصلی هم دارد
یک جدول هم برای اهنگ ها در نظر بگیرید و ایدی البوم رو به عنوان کلید خارجی این جدول در نظر بگیرید .
هر کدوم از این جداول در روش code first یک کلاس هست.
درود و سپاس بابت مهربانی های بی منتتون
در این مثال اگر قرار باشه اطلاعات کل دانش آموزان مدرسه رو به تفکیک اسم کلاس ها داخل جدول های مختلف ذخیره کنیم چه باید بکنیم؟
فرض کنیم که جدولی در دیتابیس داریم که اسم کلاس ها(کلاس اول الف، کلاس اول ب، کلاس اول ج، کلاس دوم الف، کلاس دوم ب و…) با ایندکس مشخص ذخیره شده.
حالا ما باید به ازای هر رکوردی که در جدول کلاس ها داریم یک جدول مستقل بسازیم(A1_Students، B1_Students، C1_Students، A2_Students، B2_Students، C2_Students و…)
پانوشت: میدونم که میتونیم داخل جدول دانش آموزان یک فیلد اضافه کنیم برای ذخیره ی اسم کلاس ولی میخوام که برای هر کلاس یک جدول مستقل داشته باشیم.
سلام ممنون … شما می تونید یک جدول داشته باشید برای ذخیره اطلاعات کلاس ها که شامل دو ستون اصلی نام کلاس و ایدی کلاس هست حالا می تونید اطلاعات دیگه کلاس رو هم به این جدول اضافه کنید و یک جدول داشته باشید برای ذخیره اطلاعات دانش آموزان ، حالا داخل جدول اطلاعات دانش آموزان یک ستون قرار بدید و آیدی مربوط به کلاس دانش آموز رو در این ستون ذخیره کنید در واقع رابطه بین کلاس و دانش آموز یک رابطه یک به چند هست
به نظر من این پیاده سازی اصولی تر هست تا اینکه شما به ازای هر کلاس یک جدول جداگانه برای ذخیره اطلاعات دانش آموزان بسازید
اولا تعداد جداول کاهش پیدا میکنه و حجم دیتابیش شما هم کمتر میشه و اگردر آینده یک کلاس جدید اضافه شد دیگه لازم نیست که شما یک جدول دیگه ایجاد کنید فقط کافیه که نام کلاس رو به جدول اطلاعات کلاس ها اضافه کنید و بعد هم لیست دانش آموزان اون کلاس رو به جدول دانش آموزان اضافه کنید. در ضمن اگر کلاس یک دانش آموز تغییر کرد فقط شما آیدی کلاسش رو تغییر میدید دیگه لازم نیست که شما کل اطلاعات این دانش آموز رو دوباره به یک جدول دیگه انتقال بدید.
سلام
من توی جدول های پایگاه دادم کلید خارجی دارم الان مثلا توی فرم ثبت آگهی که کاربر پر میکنه،کلید اصلیش خودش اضافه میشه خودکار بدون دخالت کاربر چطوری باید کاری کنم ک از طریق دکمه خود ب خود تو همون ثبت اگهی کلید خارجی هم اضافه بشه
سلام متاسفانه متوجه مشکل شما نشدم … اگر کلید اصلی به صورت خودکار مقدار میگیره باز هم شما می تونید موقع درج اطلاعات مقدار کلید اصلی رو دریافت کنید و کلید خارجی را در داخل جدول دیگه مقدار دهی کنید.
بسیار عالی
ممنون …