Entity Framework Core روابط یک به یک را از طریق قابلیت تشخیص ویژگی کلید خارجی پیکربندی می‌کند، و از این طریق تشخیص می‌دهد که کدامیک اصلی و کدامیک موجودیت وابسته در رابطه است.

اگر نتواند آن را انجام دهد، یا به این دلیل که نام ویژگی کلید خارجی از قرارداد پیروی نمی‌کند، یا به دلیل اینکه در مدل گنجانده نشده است، هنگامیکه سعی کنید Migration ایجاد کنید پیغام خطایی ارائه می‌شود.

فرزند/طرف وابسته نمی‌تواند برای رابطه‌ی یک به یکی که بین ‘<entity1.property2>’ و ‘<entity2.property1>’ تشخیص داده شده تعیین شود.

برای تشخیص فرزند/طرف وابسته‌ی رابطه، ویژگی کلید خارجی را پیکربندی کنید. ( در یک ارتباط یک به یک که بین دو موجودیت وجود دارد، نمی توان فرزند یا طرف وابسته ی ارتباط را معین کرد. برای شناسایی فرزند یا طرف وابسته، باید شاخصه ی کلید خارجی را تنظیم کرد)

Entity Framework Core چیست؟

EntityFramework Core یک ORM  Cross Platform هست که به ما این امکان را می دهد که بتوانیم با بانک های اطلاعاتی مختلف مثل SQL Server از طریق اشیاء NET. کار کنیم.

در مدل زیر، ویژگی کلید خارجی AuthorRef در موجودیت AuthorBiography (طرف وابسته در رابطه) از قرارداد نامگذاری کلید خارجی پیروی نمی‌کند.

public class Author
{
    public int AuthorId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public AuthorBiography Biography { get; set; }
}
public class AuthorBiography
{
    public int AuthorBiographyId { get; set; }
    public string Biography { get; set; }
    public DateTime DateOfBirth { get; set; }
    public string PlaceOfBirth { get; set; }
    public string Nationality { get; set; }
    public int AuthorRef { get; set; }
    public Author Author { get; set; }
}

در نتیجه، EF Core قادر نخواهد بود موجودیت وابسته در رابطه را تشخیص دهد.

با استفاده از Fluent API به اینصورت پیکربندی می‌شود.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Author>()
        .HasOne(a => a.Biography)
        .WithOne(b => b.Author)
        .HasForeignKey<AuthorBiography>(b => b.AuthorRef);
}

الگوی Has/With برای بستن حلقه و تعریف کامل یک رابطه بکار می‌رود.

در این مورد، از آنجایی که رابطه‌ای که باید پیکربندی شود یک رابطه‌ی یک به یک است، متد HasOne به متد WithOne زنجیر شده‌ است.

سپس موجودیت وابسته (AuthorBiography) از طریق فرستادن آن به عنوان یک پارامتر به متد HasForeignKey ، که یک لاندا که تعیین‌کننده‌ی اینکه کدام ویژگی در نوع وابسته، کلید خارجی است را می‌گیرد، شناسایی می‌شود.

پیکربندی رابطه‌ای که از Table Splitting (جداسازی جدولی) استفاده می‌کند.

جداسازی جدولی تکنیکی (ترفندی) است که شما را قادر می‌سازد از یک تک جدول برای نمایش هر دو موجودیت در یک رابطه‌ای یک به یک استفاده کنید.

با استفاده از این ویژگی ، هر دو موجودیت در رابطه‌ی یک به یکی که در بالا نشان داده شد، با هم در یک جدول پایگاه‌ داده ذخیره خواهند شد.

Entity Framework Core

Entity Framework Core

هر دو موجودیت باید از کلید اصلی یکسانی استفاده کنند، که در کلیدی خارجی در طرف وابسته‌ی رابطه به کار می‌رود.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
	modelBuilder.Entity<Author>()
		.HasOne(a => a.AuthorBiography).WithOne(b => b.Author)
		.HasForeignKey<AuthorBiography>(e => e.AuthorId);
	modelBuilder.Entity<Author>().ToTable("Authors");
	modelBuilder.Entity<AuthorBiography>().ToTable("Authors"); 
}

 

زهره سلطانیان

نوشته‌های مرتبط

دیدگاه‌ها

*
*

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