PDA

View Full Version : سوال: نحوه config رابطه ی 1-1 در کد فرست



alireza70
یک شنبه 10 اسفند 1393, 23:05 عصر
سلام
من می خوام با codefirst یه رابطه ی 1-1 رو ایجاد کنم و به وسیله ی Fluent API رابطه رو config کنم ولی به من اجازه ی گرفتن کلید فیلدی به عنوان کلید خارجی رو نمیده.

به نظر شما با این روش(Fluent API) راهی هست بتونم؟

ali_md110
دوشنبه 11 اسفند 1393, 21:40 عصر
برای رابطه یک به یک فقط کافی هست تا درون هرکلاس یک Navigation Property (به رنگ آبی مشخصه) از کلاس دیگر پیاده کنید مثال کلاس دانش اموز و کلاس آدرس
در رابطه یک به یک مهم اونه که باید طرف Principal یعنی اون کلاسی که باید اول اطلاعات درونش ذخیره بشه رو مشخص کرد




public class Student
{
public Student() { }

public int StudentId { get; set; }
public string StudentName { get; set; }

public virtual StudentAddress StudentAddress { get; set; }

}

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; }
}

alireza70
دوشنبه 11 اسفند 1393, 23:30 عصر
ممنون اینو میدونستم من میخواستم اولا با fluentapi باشه بعدم کلیدخارجیم میخواستم تعریف کنم

ali_md110
سه شنبه 12 اسفند 1393, 00:25 صبح
public class StudentConfig : EntityTypeConfiguration<Student>
{
public StudentConfig()
{
// one-to-one
this.HasOptional(x => x.StudentAddress )
.WithRequired(x => x.Student)
.WillCascadeOnDelete();
}
}


Principal : طرفی که ابتدا در بانک اطلاعاتی ذخیره خواهد شد.
Dependent : طرفی که پس از ثبت Principal در بانک اطلاعاتی ذخیره می‌شود.
Principal می‌تواند بدون نیاز به Dependent وجود داشته باشد.
وجود Dependent بدون Principal ممکن نیست زیرا ارتباط بین این دو توسط یک کلید خارجی تعریف می‌شود.
میتوانید هر کدام دلخواهتان هست از موجودیتها را به عنوان رابطه Principal یا Dependent انتخاب کرد

alireza70
سه شنبه 12 اسفند 1393, 20:19 عصر
من مشکلم این بود که می خواستم مثل رابطه های یک به چند یه فیلد جدا به عنوان کلید خارجی بگیرم . در صورتی که تو رابطه ی یک به یک کلید اصلی principal کلید اصلی dependent هم میشه .فقط باید بعد از تنظیم رابطه دقیقا یه فیلد مثله کلید principal توی dependent به عنوان کلید تعریف کنیم. اونوقت همه چی حل میشه

ali_md110
سه شنبه 12 اسفند 1393, 22:23 عصر
عزیز من وقتی توی هر دوطرف رابطه یک Navigtion از نوع کلاس اون یکی تعریف کنی میشه رابطه 1 به 1
و توی بانک اطلاعاتی اگر نکاه کنید دوتا کلید اصلی درون هردو جدول میسازه در این مثال StudentId کلید اصلی هردوجدول هست

وقتی هم تنظیمات زیر انجام دادیم میاد کلید اصلی جدول StudentAddress تبدیل به Foreignkey میکنه
یعنی عبارات لامبدایی که جلوی HasOptional قرار میگیره میشه کلید فرعی یا خارجی وبا WithRequired کلید اصلی یا principal مشخص میشه

دیگه از این ساده تر نمیتونستم بگم



this.HasOptional(x => x.StudentAddress )
.WithRequired(x => x.Student)
.WillCascadeOnDelete();