PDA

View Full Version : ایجاد دو رابطه بین دو جدول در Entityframework



pecojob
دوشنبه 25 خرداد 1394, 20:10 عصر
با سلام ، من ef code first رو تازه شروع کردم و یه سوال دارم میخواستم ببینم این مدل رابطه رو چطور میشه با entityframework پیاده کنیم؟ با فرض این که دو تا entity زیر رو داشته باشیم:



public class Profile
{
public string Name { get; set; }
public string Mobile { get; set; }
public Image Image { get; set; }
public Complex Complex { get; set; }
public virtual ICollection<Complex> ManagingComplexs { set; get; }
public virtual ICollection<Complex> FollowingComplexs { set; get; }
public virtual ICollection<Profile> FollowingProfiles { set; get; }
}



public class Complex
{
public string Name { get; set; }
public Profile Admin { get; set; }

public virtual ICollection<Profile> Followers { set; get; }
public virtual ICollection<Profile> Managers { set; get; }
}


الان من توی complex یه profile دارم که ادمین ارشد رو مشخص میکنه (رابطه یک به یک) و همچنین لیستی از پروفایل ها رو به عنوان Follower این complex (رابطه چند به چند) و لیست دیگری از پروفایل ها رو به عنوان ادمین های فرعی این complex (رابطه چند به چند دیگر) هستن ، متناظر این ها رو هم در کلاس پروفایل دارم ، همچنین برای هر پروفایل هم لیستی از Follower ها رو نیاز دارم ، ممنون میشم اگه راهنمایی بکنید که این روابط برقراریش چطور و با چه روشی ممکنه.ممنون

ali_md110
سه شنبه 26 خرداد 1394, 00:16 صبح
در طراحی دیتابیس وقتی دو جدول رابطه یک به یک دارند یعنی اینکه یک جدول ادامه جدول دیگری هست
و ابتدا باید در جدولی که به نظرتون اصلی تر هست و Principal باید یک کلید اصلی تعریف و همان کلید دوباره در جدول بعدی یعنی
Dependent هم بصورت کلید اصلی تعریف شود.و رابطه ها برقرار شود و اگر خواستید رابطه چند به چند بزنید برای هر جدول کلید اصلی مخصوص خودش تعریف و یک جدول سوم ایجاد و کلید اصلی هردوجدول را دراین جدول ثالث بعنوان کلید فرعی درج میکنیم

در Entity Framework همین مراحل بصورت دیگر پیاده خواهدشد
برای رابطه یک به یک باید یک Navigation از نوع کلاس متقابل در کلاسها تعریف کنید و Principal یعنی اون کلاسی که باید ابتدا رکورد درونش درج بشه رو با Fluent مشخص کنید
وبرای رابطه چند به چند در اینجا چون هر دو جدول شما یک جدول با ماهیت یکسان حساب میشوند باید فقط چدول Princioal با خودش رابطه چند به چند داشته باشد


public class Profile
{
primary key
public int ProfileId{ get; set; }
public string Name { get; set; }
public string Mobile { get; set; }
public Image Image { get; set; }
public Complex Complex { get; set; }; }
}
public class Complex

{
public string Name { get; set; }
public Profile Admin { get; set; }
public Profile Profile{ get; set; }; }
}

این هم تنظیمات مدلها برای رابطه یک به یک


}
this.HasOptional(x => x.Complex)
.WithRequired(x => x.Principal)
.WillCascadeOnDelete();
{

قسمتی که با WithRequired هست میشه Principalیعنی اول در دیتابیس ذخیره میشه و طرف دوم یعنی
Dependent
که با HasOptional مشخص میکنیم
برای رابطه های چند به چند هم باید دو کالکشن از کلاس Principal درون کلاس principal بسازید در اینجا فرض ب اینکه کلاس اصلی profile باشد


public class Profile
{
public string Name { get; set; }
public string Mobile { get; set; }
public Image Image { get; set; }
public virtual ICollection<Profile> LeftProfiles { set; get; }
public virtual ICollection<Profile> RightProfiles { set; get; }
public virtual ICollection<Flower> Flower{ set; get; }
}

رابطه جند به چند نیازی به تنظیمات ندارد ولی میتونید یک اسم دلخواه برای اونها درون دیتابیس بسازید


this.HasMany(t => t.LeftProfiles)
.WithMany(t => t.RightProfiles)
.Map(m =>
{
m.ToTable("RelationPrincipalComplex", ");
m.MapLeftKey("LeftSide");
m.MapRightKey("RightSide");
});

شما یک موجودیت دیگه دارید بنام Flowers که برای ایجاد رابطه یک به چند باید بدین صورت تعریف کنید که یک Navigation property از کلاس Principal درونش تعریف و یک کالکشن از نوع Flowers درون کلاس Principal تعریف کنید


public class Flower
{
public int ID{get;set}
[ForeignKey("ProfileID")]
public virtual Profile Profile{ get; set; }
public virtual int? ProfileID { get; set; }
}

pecojob
سه شنبه 26 خرداد 1394, 08:14 صبح
ممنون از پاسختون ، قسمتی از جوابو متوجه نشدم ولی قسمتی از جواب رو گرفتم من با fluent مشکلی ندارم فقط سوالم اینه که توی complex که معرف یه مجتمع هست تعدادی profile برای ادمینی و تعدادی پروفایل برای مدیریت وجود داره یعنی این complex دو رابطه یک به چند با پروفایل داره این قضیه چطور حل شد بالا ، ممکنه توضیح بدین؟

ali_md110
سه شنبه 26 خرداد 1394, 08:40 صبح
نحوه ارتباط رو براتون توضیح دادم
یک سوال :قسمت تنظیمات یک به یک که بالا نوشتم در مرورگر من مثل تگ html بهم ریخته نشون میده مرورگر شما هم همینطوره?

در بالا یک رابطه یک به یک
دو رابطه چند به چند
و یک رابطه یک به چند بین Profile و Flowers برقرار شد

اصلن موجودیت Profile با Complex رابطه یک به چند برقزار نکردیم و اگر بخواهیم برقرار کنیم باید رابطه یک به یک را نقض کنیم
شما نمیتونید همزمان بین دو موجودیت هم رابطه یک یه یک داشته باشید و هم رابطه یک به چند داشته باشید
برای این کار یک فیلد به عنوان کلید اصلی در Complex مثل ComplexIdتعریف و و فیلد اصلی Profile یعنی ProfileIDرا هم در Complex به عنوان کلید فرعی بیاوریم ورابطه یک به چند را با Fluent یا باattribute [ForeignKey تنظیم کنیم

pecojob
سه شنبه 26 خرداد 1394, 09:03 صبح
متشکرم ، بله توی مرورگر من هم همینطوره