ورود

View Full Version : سوال: تعریف 2 تا کلید خارجی در یک جدول



kamran_14
سه شنبه 26 تیر 1397, 12:22 عصر
سلام
آیا این 2 دستور برای تعریف 2 تا کلید خارجی درسته؟
من در یک جددول 2 تا کلید خارجی دارم

public config() {
HasRequired(current => current.tblRole).WithMany(Role => Role.tblUsers).HasForeignKey(current => current.RoleId).WillCascadeOnDelete(false);
HasRequired(current => current.tblState).WithMany(Role => Role.tblUsers).HasForeignKey(current => current.StateId).WillCascadeOnDelete(false);
}

ali_md110
سه شنبه 26 تیر 1397, 17:26 عصر
اگر شما در یک جدول دوتا کلید خارجی دارید بهتره از Attribute Inverse Property بهره ببیرد
به دلیل اینکه فیلدهای اضافی و با اسامی نا مفهوم در چدول بوجود نیاید



public class User
{
public int UserId { get; set; }
public string UserName { get; set; }


[ForeignKey("RoleId ")]
public Role Role{ get; set; }
public int RoleId { get; set; }

[ForeignKey("RoleId1 ")]
public Role Role1{ get; set; }
public int RoleId1 { get; set; }
}

public class Role
{
public int RoleId { get; set; }
public string Name { get; set; }

[InverseProperty("Role")]
public ICollection<User> Users1{ get; set; }
[InverseProperty("Role1")]
public ICollection<User> Users2{ get; set; }
}


دقت کنید در کلاس Role عنوان InverseProperty تنظیم شده به Role وRole1 و باید در کلاس User هم نام Navigation Property هاتون همین نام داشته باشد
مثل:


public Role Role{ get; set; }public Role Role1{ get; set; }

نیازی به کلاسهای Config و Fluent Api هم ندارید با همین DataAnnotations Attributes میتونید به راحتی روابط را برقرار کنید

kamran_14
جمعه 29 تیر 1397, 09:56 صبح
اگر شما در یک جدول دوتا کلید خارجی دارید بهتره از Attribute Inverse Property بهره ببیرد


ممنون
پراپرتی InverseProperty چه کار می‌کند؟
InverseProperty آیا نام فیلدها را تغییر می‌دهد؟
چرا در کلاس user از InverseProperty استفاده نشده؟

ali_md110
جمعه 29 تیر 1397, 15:30 عصر
مباحثی به عنوان Principal و Dependent در بحث روابط یک به چند و سایر روابط مطرح هست
Principal یک سر رابطه(کلید اصلی) و Dependent سر دیگر رابطه هست(طرفی که کلید فرعی هست)
یعنی یک رابطه دو سر دارد و هر سر باید سر خود را پیدا کند(ببخشید خیلی سر تو سر شد دیگه :لبخند:)

مثلا فرض کنیم کلاس Role داریم و Principal هست یعنی کلید اصلی
و یک کلاس دیگر داریم بنام User و Dependent هست , در کلاس Users ممکن است دو تا کلید خارجی از نوع کلاس Role داشته باشیم یا در واقع دو گروه Role داشته باشیم

برای اینکه هم ef و هم ما قادر به شناسایی این رابطه ها باشیم که بدانیم کدام سر Principalبه کدام سر Dependent متصل هست از ویژگی InversePropety بهره میبریم

در ضمن نیازی نیست الزاما از InverseProperty بهره ببریم ولی برای همون مواردی که در بالا گفتم بهتر هست بکار ببریم
شما یکبار بدون InverseProp بکار ببرید و مراجعه کنید به جدول بانک برنامه ببینید چه اتفاقی افتاده
میببیند که 4 فیلد تشکیل شده و اگر InverseProp استفاده کنید تنها دو فیلد تشکیل شده

و تعریف InverseProperty در یک سر رابطه و اونهم بخش Principal کفایت میکند
و نیاز نیست در سر دیگر رابطه تعریف شود