در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

آموزش Entity Framework قسمت 5 : تعریف رابطه ها بخش 1

در ادامه سری مقالات آموزشی Entity Framework قصد دارم در باره رابطه ها و نحوه تعریف آنها بوسیله Fluent API و Attribute بنوسم. رابطه ها و استفاده آنها در Entity Framework در دو بخش ارائه خواهند شد. بخش اول به تعریف ساده رابطه ها خواهیم پرداخت، در بخش دوم نحوه تغییر در تعریف رابطه ها بوسیله Fluent API و Attribute را بررسی خواهیم کرد. در ابتدا تعریفی از رابطه را ارائه داده و انواع رابطه و چگونگی استفاده آنها را در Entity Framework بررسی خواهیم خواهیم کرد.

تعریف رابطه ها

به طور کلی وقتی یک موجودیت ما با یک موجودیت دیگر ارتباط داشته باشد، به آن رابطه یا Relation می گویند. برای مثال، در یک سیستم مدیریت فروش، ما یک موجودیت مشتری داریم، هر مشتری می تواند داخل سیستم چندین سفارش ثبت شده داشته باشد. یعنی در سیستم ما، بین موجودیت مشتری و سفارش رابطه وجود دارد.

انواع رابطه

به طور کلی رابطه ها بر چهار نوع می باشند:

  1. رابطه One-To-Many
  2. رابطه Zero Or One-To-Many
  3. رابطه Many-To-Many
  4. رابطه One-To-One

رابطه One-To-Many

این نوع رابطه که رابطه پیک به چند نیز نامیده می شوند به این معنی می باشند که یک موجودیت می تواند یک یا چندین موجودیت دیگر نیز داشته باشد. به مثال مشتری و سفارش برمی گردیم، گفتیم که یک مشتری می تواند داخل سیستم چندین سفارش ثبت شده داشته باشد و هر سفارش متعلق به یک مشتری است. در حقیقت رابطه بین مشتری و سفارش یک رابطه یک به چند است.

رابطه Zero Or One-To-Many

مثال مشتری و سفارش را در نظر بگیرید، رابطه از نوع یک به چند بود، در این رابطه هر سفارش باید یک مشتری داشته باشد، ولی اگر رابطه مشتری و سفارش از نوع Zero or One-To-Many باشد سفارش می تواند بدون مشتری باشد، یعنی هیچ مشتری برای سفارش تعیین نشود.

رابطه Many-To-Many

این رابطه که رابطه چند به چند نیز نام دارد، تعیین می کند که هر دو موجودیت می توانند چندین مورد از موجودیت دیگر را داشته باشند. برای مثال، در یک سیستم ما تعدادی کاربر و تعدادی گروه های کاربری داریم. هر گروه کاربری می تواند چندین گروه کاربری و هر گروه کاربری چندین کاربر داشته باشد. در حقیقت رابطه بین گروه کاربری و کاربر رابطه از نوع چند به چند است.

رابطه One-To-One

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

*این نوع رابطه کاربر زیادی ندارد، زیرا در Entity Framework پیاده سازی این رابطه با Complex Type ها منطقی تر است که در بخش های بعدی در مورد قابلیت Complex Type توضیح خواهیم داد.

در ادامه به نحوه پیاده سازی این رابطه در Entity Framework و همچنین نحوه تعریف جداول بانک اطلاعاتی خواهیم پرداخت. بر بخش اول این تعریف ها از Attribute ها یا Fluent API برای تعریف Mapping استفاده نخواهیم کرد، زیرا Entity Framework به صورت خودکار با پردازش کلاس ها رابطه ها را شناسایی خواهد کرد.

رابطه One-To-Many

مثالی که در این مورد استفاده خواهیم کرد، همان مثال مشتری و سفارش است. موجودیت های مشتری و سفارش را به صورت زیر تعریف می کنیم:

    public class Customer
    {
        public int CustomerID { get; set; }
        public string Name { get; set; }
        public virtual ICollection Orders { get; set; }       
    }

    public class Order
    {
        public int OrderID { get; set; }
        public virtual Customer Customer { get; set; }
        public DateTime Date { get; set; }
    }

همانطور که در کد بالا مشاهده می کنید، در کلاس Customer یک Collection از نوع Order و در کلاس Order یک خاصیت از نوع Customer. مشخص است که یک مشتری چندین سفارش و هر سفارش یک مشتری دارد.

در کد بالا خصوصیت های Orders در کلاس Customer و Customer در کلاس Order از نوع virtual هستند. دلیل این تعریف قابلیت Lazy Loading می باشد که از خصوصیات Entity Framework می باشد که در قسمت های بعدی در مورد این قابلیت توضیح خواهیم داد. فقط باید دقت کرد که در صورت عدم استفاده از virtual در تعریف خصوصیت های مربوط به رابطه ها، دسترسی به اطلاعات امکان پذیر نخواهد بود.

جدول معادل این رابطه به صورت زیر می باشدک

CREATE TABLE [Customers]
(
	[CustomerID] INT IDENTITY NOT NULL PRIMARY KEY,
	[Name] NVARCHAR(250) NOT NULL
);
GO

CREATE TABLE [Orders]
(
	[OrderID] INT IDENTITY NOT NULL PRIMARY KEY,
	[Customer_ID] INT NOT NULL REFERENCES Customers(CustomerID),
	[Date] DATETIME NOT NULL
);
GO

رابطه Zero or One-To-Many

تنها تفاوت این رابطه به رابطه یک به چند نحوه نعریف جدول Orders در بانک اطلاعاتی است:

CREATE TABLE [Orders]
(
	[OrderID] INT IDENTITY NOT NULL PRIMARY KEY,
	[Customer_ID] INT NULL REFERENCES Customers(CustomerID),
	[Date] DATETIME NOT NULL
);
GO

ستون Customer_ID در این جدول از نوع NULL تعریف شده است.

رابطه Many-To-Many

این رابطه مشخص می کند که دو موجودیت می توانند چندین مورد از دیگری را دارا باشند. مثال کاربر و گروه کاربری را بررسی می کنیم. کلاس های زیر را در نظر بگیرید:

public class User
{
    public int UserID { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public virtual ICollection UserGroups { get; set; } 
}

public class UserGroup
{
    public int UserGroupID { get; set; }
    public string GroupName { get; set; }
    public virtual ICollection Users { get; set; } 
}

همانطور که مشاهده می کنید کلاس User دارای یک خصوصیت به نام UserGroups بوده که از نوع مجموعه ای از UserGroup می باشد و همچنین کلاس UserGroup دارای خصوصیتی با نام Users از نوع مجموعه کلاس User می باشد. دقت کنید که هر دو خصوصیت از نوع virtual می باشند.

اما نحوه تعریف رابطه چند به چند در بانک اطلاعاتی به چه صورت است؟ برای تعریف این رابطه، نیاز به یک جدول کمکی داریم. تعریف رابطه بالا در بانک اطلاعاتی به صورت زیر می باشد:

CREATE TABLE [Users]
(
	[UserID] INT IDENTITY NOT NULL PRIMARY KEY,
	[Username] NVARCHAR(250) NOT NULL,
	[Password] NVARCHAR(250) NOT NULL
);
GO

CREATE TABLE [UserGroups]
(
	[UserGroupID] INT IDENTITY NOT NULL PRIMARY KEY,
	[GroupName] NVARCHAR(250) NOT NULL
);
GO

CREATE TABLE [UsersUserGroups]
(
	[User_ID] INT NOT NULL REFERENCES [Users](UserID),
	[UserGroup_ID] INT NOT NULL REFERENCES [UserGroups](UserGroupID),
	PRIMARY KEY([User_ID],[UserGroup_ID])
);
GO

جدول سوم با نام UsersUserGoups رابطه چند به چند را بین جدول های Users و UserGroups برقرار می کند.

رابطه One-To-One

ابن نوع رابطه را به دلیل خاص بودن نوع ان به قسمت بعد موکول خواهیم کرد.

در قسمت بعدی نحوه تغییر در Mapping بوسیله Fluent API و Attribute ها را بررسی خواهیم کرد.
عنوان
1 آموزش Entity Framework قسمت 1 : معرفی و شروع به کار رایگان
2 آموزش Entity Framework قسمت 2 : کلاسهای DbContext و DbSet رایگان
3 آموزش Entity Framework قسمت 3 : تعریف Mapping با Attribute ها رایگان
4 آموزش Entity Framework قسمت 4 : تعریف Mapping با Fluent API رایگان
5 آموزش Entity Framework قسمت 5 : تعریف رابطه ها بخش 1 رایگان
6 آموزش Entity Framework قسمت 6 : تعریف رابطه ها بخش 2 رایگان
زمان و قیمت کل 0″ 0
4 نظر
عباس خلیلی خو

سلام.

توضیحات بسیار خلاصه و مفیده.عالی

ممنون

ZimaSystem

سلام در مورد جای گذاری های مختلفی که با DataAnnotation ایجاد شده در مثال زیر توضیح میدید

من نمیفهمم چی میگه دقیقا

چه تفاوتی داره این جا به جا کردن خصیصه

لینک

حسین احمدی

سلام، اگر منظورتوت ForeignKeyAttribute هست، شما زمان تعریف navigation دو خصوصیت ایجاد می کنید، یکی برای اعمال Navigation هست که به صورت virtual تعریف میشه و یکی دیگه که ForeignKey هست. حالا شما Attribute ذکر شده رو اگر بر روی Navation بزارید به عنوان پارامتر ورودی نام ForeinKey رو مشخص می کنید و اگر این Attribute بر روی FK قرار بگیره نام Navigation رو به عنوان پارامتر ورودی انتخاب می کنید.

arezo76

سلام ممنونم اموزشتون خیلی بهم کمک کرد 

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره پاییزه می تونی امروز ارزونتر از فردا خرید کنی ....