استراتژی وراثت در EF 6

آخرین بروز رسانی: 1400/11/29

Table per Hierarchy (TPH): به طور پیش فرض، EF Core سلسله مراتب ارثی از انواع دات نت را به یک جدول در پایگاه داده نگاشت می کند تا داده ها را برای همه انواع در سلسله مراتب ذخیره کند، و یک ستون تفکیک کننده(discriminator ) برای شناسایی نوع نشان دهنده هر سطر استفاده می شود.

 

Table per Type (TPT):  یک جدول پایه برای کلاس پدر و برای هر کلاس فزرند یک نیز جدول جداگانه  ایحاد میکند .

 

Table per Concrete Class (TPC): برای هر کلاس یک جدول جدا ایجاد میکند , اما نه برای کلاسهای abstract . پس اگر چند کلای از کلاس abstract ارثبری کنند propertiyهای کلاس پدر به حدول جداگانه ای که برای subclassها ایجاد شده منتقل میشوند . یا به عبارتی در نوع Table per Concrete، ما دقیقاً از یک جدول برای هر کلاس (غیر abstract) استفاده می کنیم و تمام propertyها از جمله propertyهای ارثیبری شدهِ یک کلاس را می توان به ستون های جدول نگاشت کرد. 

 

 

کلاسهای زیر را در نظر بگیرید

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class User : Person
{
    public string UserName { get; set; }
}

public class Client : Person
{
    public string Email { get; set; }
}
public class ApplicationContext : DbContext
{
  public DbSet People { get; set; }
  public DbSet Clients { get; set; }
  public DbSet Users { get; set; }
}

 

در استراتژس TPH جدول خروجی در دیتابیس به این شکل خواهد بود

CREATE TABLE [People] (
  [Id] int NOT NULL IDENTITY,
  [Name] nvarchar(max) NULL,
  [Discriminator] nvarchar(max) NOT NULL,
  [Email] nvarchar(max) NULL,
  [UserName] nvarchar(max) NULL,
  CONSTRAINT [PK_People] PRIMARY KEY ([Id])
);

 

 

تبدیل کد بالا به TPC

[Table("People")]
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

[Table("Users")]
public class User : Person
{
    public string UserName { get; set; }
}

[Table("Clients")]
public class Client : Person
{
    public string Email { get; set; }
}

 

 

خروجی کد بالا در sql بدین  شکل احرا میشود

CREATE TABLE [People] (
  [Id] int NOT NULL IDENTITY,
  [Name] nvarchar(max) NULL,
  CONSTRAINT [PK_People] PRIMARY KEY ([Id])
);

CREATE TABLE [Clients] (
  [Id] int NOT NULL,
  [Email] nvarchar(max) NULL,
  CONSTRAINT [PK_Clients] PRIMARY KEY ([Id]),
  CONSTRAINT [FK_Clients_People_Id] FOREIGN KEY ([Id]) REFERENCES [People] ([Id]) ON DELETE NO ACTION
);

CREATE TABLE [Users] (
  [Id] int NOT NULL,
  [UserName] nvarchar(max) NULL,
  CONSTRAINT [PK_Users] PRIMARY KEY ([Id]),
  CONSTRAINT [FK_Users_People_Id] FOREIGN KEY ([Id]) REFERENCES [People] ([Id]) ON DELETE NO ACTION
);

 

 

نتیجه
با جدول در هر سلسله مراتب (TPH)، EF Core یک جدول منفرد با ستونی برای تمایز بین جداول مشتق شده ایجاد می کند. با نگاشت Table-per-Type (TPT)، EF Core جداول مختلفی را برای هر جداول مشتق شده ایجاد می کند. مزیت داشتن یک جدول خاص برای هر موجودیت منحرف شده، فراتر از داشتن سازماندهی بهتر برای جداول در پایگاه داده، امکان پیکربندی برخی ویژگی ها در کلاس مشتق شده است که مورد نیاز است. این چیزی است که هنگام استفاده از نقشه برداری TPH امکان پذیر نیست، زیرا با این رویکرد، زمانی که جدول پایه یک جدول مشترک است، ویژگی ها باید مقادیر null را مجاز کنند.

نظر دهید

آدرس ایمیل شما منتشر نخواهد شد. فیلدهای الزامی علامت گذاری شده اند *