PDA

View Full Version : ارتباط چند به چند



minaforotan
یک شنبه 11 مرداد 1394, 13:56 عصر
سلام
من دارم از code first تو mvc استفاده میکنم و به یک مشکلی خوردم
دارم یک سیستم ارسال پیام پیاده سازی میکنم که کلاسام به این صورته که هر پرسنل میتونه لیستی از پیام ها رو دریافت کنه و هر پیام هم میتونه واسه لیستی از پرسنل ارسال شه
تا اینجا که مشکلی نست و این ارتباط رو یک رابطه چند به چند در نظر میگیره و جدول سوم خودکار ساخته میشه

public class Message
{

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity )]
public Int64 ID { get; set; }


[DataType(DataType.MultilineText)]
[Display(Name = "متن")]
[Required(ErrorMessage = "این فیلد الزامی است", AllowEmptyStrings = false)]
public string Body { get; set; }
[Display(Name = "تاریخ")]

public DateTime DateMsg { get; set; }
[Display(Name = "زمان ارسال")]

public string DateMsgFa { get; set; }

public virtual ICollection<personnel> personnels { get; set; }


}




public class personnel
{

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity )]
[ScaffoldColumn(false)]
public Int64 ID { get; set; }
[Display(Name = "نام")]
[Required(ErrorMessage = "*", AllowEmptyStrings = false)]
public string Name { get; set; }
[Display(Name = "فامیل")]
[Required(ErrorMessage = "*", AllowEmptyStrings = false)]
public string Family { get; set; }
public string FullName { get { return this.Name + " " + this.Family; } }
public virtual ICollection<Message> Messages { get; set; }



}



اما مشکل زمانی به وجود میاد که من میگم هر پیام رو یک پرسنل فرستاده یعنی خط زیر در کلاس meesage اضافه میشه


public virtual personnel Azpersonnel { get; set; }

اونوقت دیگه جدول سوم رابطه قبلی ساخته نمیشه چون میاد icollection ای که در جدول پرسنل برای رابطه چند به چندم ساختم رو با این خط جدید در نظر میگیره و یک ارتباط یک به چند میسازه

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

r4hgozar
یک شنبه 11 مرداد 1394, 15:34 عصر
سلام.
شما از اون جدول واست می تونین همین ها رو بفمین.
هر نامه رو یک پرسنل ایجاد کرده رو منظورمه.

salar IT man
یک شنبه 11 مرداد 1394, 17:54 عصر
سلام
من دارم از code first تو mvc استفاده میکنم و به یک مشکلی خوردم
دارم یک سیستم ارسال پیام پیاده سازی میکنم که کلاسام به این صورته که هر پرسنل میتونه لیستی از پیام ها رو دریافت کنه و هر پیام هم میتونه واسه لیستی از پرسنل ارسال شه
تا اینجا که مشکلی نست و این ارتباط رو یک رابطه چند به چند در نظر میگیره و جدول سوم خودکار ساخته میشه

public class Message
{

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity )]
public Int64 ID { get; set; }


[DataType(DataType.MultilineText)]
[Display(Name = "متن")]
[Required(ErrorMessage = "این فیلد الزامی است", AllowEmptyStrings = false)]
public string Body { get; set; }
[Display(Name = "تاریخ")]

public DateTime DateMsg { get; set; }
[Display(Name = "زمان ارسال")]

public string DateMsgFa { get; set; }

public virtual ICollection<personnel> personnels { get; set; }


}




public class personnel
{

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity )]
[ScaffoldColumn(false)]
public Int64 ID { get; set; }
[Display(Name = "نام")]
[Required(ErrorMessage = "*", AllowEmptyStrings = false)]
public string Name { get; set; }
[Display(Name = "فامیل")]
[Required(ErrorMessage = "*", AllowEmptyStrings = false)]
public string Family { get; set; }
public string FullName { get { return this.Name + " " + this.Family; } }
public virtual ICollection<Message> Messages { get; set; }



}



اما مشکل زمانی به وجود میاد که من میگم هر پیام رو یک پرسنل فرستاده یعنی خط زیر در کلاس meesage اضافه میشه


public virtual personnel Azpersonnel { get; set; }

اونوقت دیگه جدول سوم رابطه قبلی ساخته نمیشه چون میاد icollection ای که در جدول پرسنل برای رابطه چند به چندم ساختم رو با این خط جدید در نظر میگیره و یک ارتباط یک به چند میسازه

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


اولا همچین مشکلی هیج وقت پیش نخواهد آمد که اشاره کرده اید!!
دو مدل میتوانند n تا ارتباط داشته باشند بدون اینکه به دیگری آسیب بزند(اگر درست کانقیگ شوند)

اگر بحث و گفتگو مانند فیسبوک مد نظر نیست به شکل زیر عمل کنید.



public class Message
{
public virtual int Id { get; set; }
public virtual string Content{ get; set; }
public virtual MessageStatus Status{ get; set; }
public virtual DateTime SendDate{ get; set; }
[ForeignKey("SenderId")]
public virtual ApplicationUser Sender{get;set;}
[ForeignKey("ReciverId")]
public virtual ApplicationUser Reciver{get;set;}
public virtual int SenderId{get;set}
public virtual int ReciverId{get;set}
//...

}
public class ApplicationUser{


public virtual int Id{get;set}
public virtual string UserName{get;set}
public virtual string Password{get;set}
[InverseProperty("Sender")]
public virtual ICollection<Message> SentMessages{get;set}
[InverseProperty("Reciver")]
public virtua ICollection<Message> ReceivedMessages{get;set}
}







هر موقع خواستید یک کاربر پیغامی را به افراد دیگر بفرستد لازم است به تعداد دریافت کننده ها ، در جدول Message رکورد ثبت کنید. به این صورت هر موقع لازم بود پیغام های دریافتی یک کاربر را نمایش دهید لازم است کوئری بزنید که هرجا آی دی این کاربر در جدول Message ها در فیلد ReciverId دیده میشود پیغام ها رو Select کن و .... باقی ماجرا.
میشود با اضافه کردن یک جدول دیگر هم کاری کرد شبیه به کار فیسبوک.

همچین چیزیو یه سال پیش پیاده کردم. البته با Asp.net Wbforms 4.5 و EF DbFirst بود اون پروژه که در کل دید کافیه بگیرید :
اینجا : مثل اینکه سایت برنامه نویسان فیلتر هستش. برید سایت برنامه نویسان و سرچ بزنید barnamenevis-an.org/Articles/Article2517.html
سورس :https://github.com/rabbal/AspNetWebForms-Forum/blob/master/Entities/Models/Conversation.cs

minaforotan
دوشنبه 12 مرداد 1394, 09:29 صبح
salar IT man عزیز ممنون InverseProperty که تنظیم کردم درست شد میشه کمی در مورد خاصیت InverseProperty توضیح بدین؟

salar IT man
دوشنبه 12 مرداد 1394, 13:09 عصر
salar IT man عزیز ممنون InverseProperty که تنظیم کردم درست شد میشه کمی در مورد خاصیت InverseProperty توضیح بدین؟

خواهش میکنم.
شکل مدل های شما باید به این شکل باشد که در پست قبل گفتم.
InverseProperty برای زمانی است
دیگر جای حدس و گمان و پیش‌فرضی باقی نماند. صریحا تنظیمات مشخص شده‌اند. اگر از Fluent Api ها استفاده میکنید دیگر لازم نیست به این صورت از Attribute ها استفاده کنید.