Наследование в entity framework


Совет Команда EF продемонстрировала и подробно рассказала о сопоставлении TPC в эпизоде стенда сообщества данных .NET


Download 39.18 Kb.
bet5/5
Sana28.10.2023
Hajmi39.18 Kb.
#1730049
1   2   3   4   5
Bog'liq
NASLEDOVANIYE ...

Совет
Команда EF продемонстрировала и подробно рассказала о сопоставлении TPC в эпизоде стенда сообщества данных .NET. Как и все эпизоды Сообщества Standup, вы можете смотреть TPC эпизод сейчас на YouTube.
C#Копировать
modelBuilder.Entity().UseTpcMappingStrategy()
.ToTable("Blogs");
modelBuilder.Entity()
.ToTable("RssBlogs");
Совет
Вместо вызова ToTable для каждого типа сущности только вызов modelBuilder.Entity().UseTpcMappingStrategy() для каждого корневого типа сущности создает имена таблиц по соглашению.
Совет
Сведения о настройке разных имен столбцов первичного ключа в каждой таблице см. в разделе Конфигурация аспектов, относящихся к таблице.
EF создаст следующую схему базы данных для приведенной выше модели.
SQLКопировать
CREATE TABLE [Blogs] (
[BlogId] int NOT NULL DEFAULT (NEXT VALUE FOR [BlogSequence]),
[Url] nvarchar(max) NULL,
CONSTRAINT [PK_Blogs] PRIMARY KEY ([BlogId])
);


CREATE TABLE [RssBlogs] (
[BlogId] int NOT NULL DEFAULT (NEXT VALUE FOR [BlogSequence]),
[Url] nvarchar(max) NULL,
[RssUrl] nvarchar(max) NULL,
CONSTRAINT [PK_RssBlogs] PRIMARY KEY ([BlogId])
);
Схема базы данных TPC
Стратегия TPC похожа на стратегию TPT, за исключением того, что для каждого конкретного типа в иерархии создается другая таблица, но таблицы не создаются для абстрактных типов, отсюда и название "table-per-concrete-type". Как и в случае с TPT, сама таблица указывает тип сохраненного объекта. Однако, в отличие от сопоставления TPT, каждая таблица содержит столбцы для каждого свойства в конкретном типе и его базовых типах. Схемы баз данных TPC денормализованы.
Например, рассмотрите возможность сопоставления этой иерархии:
C#Копировать
public abstract class Animal
{
protected Animal(string name)
{
Name = name;
}


public int Id { get; set; }
public string Name { get; set; }
public abstract string Species { get; }


public Food? Food { get; set; }
}


public abstract class Pet : Animal
{
protected Pet(string name)
: base(name)
{
}


public string? Vet { get; set; }


public ICollection Humans { get; } = new List();
}


public class FarmAnimal : Animal
{
public FarmAnimal(string name, string species)
: base(name)
{
Species = species;
}


public override string Species { get; }


[Precision(18, 2)]
public decimal Value { get; set; }


public override string ToString()
=> $"Farm animal '{Name}' ({Species}/{Id}) worth {Value:C} eats {Food?.ToString() ?? ""}";
}


public class Cat : Pet
{
public Cat(string name, string educationLevel)
: base(name)
{
EducationLevel = educationLevel;
}


public string EducationLevel { get; set; }
public override string Species => "Felis catus";


public override string ToString()
=> $"Cat '{Name}' ({Species}/{Id}) with education '{EducationLevel}' eats {Food?.ToString() ?? ""}";
}


public class Dog : Pet
{
public Dog(string name, string favoriteToy)
: base(name)
{
FavoriteToy = favoriteToy;
}


public string FavoriteToy { get; set; }
public override string Species => "Canis familiaris";


public override string ToString()
=> $"Dog '{Name}' ({Species}/{Id}) with favorite toy '{FavoriteToy}' eats {Food?.ToString() ?? ""}";
}


public class Human : Animal
{
public Human(string name)
: base(name)
{
}


public override string Species => "Homo sapiens";


public Animal? FavoriteAnimal { get; set; }
public ICollection
Pets { get; } = new List
();


public override string ToString()
=> $"Human '{Name}' ({Species}/{Id}) with favorite animal '{FavoriteAnimal?.Name ?? ""}'" +
$" eats {Food?.ToString() ?? ""}";
}

Download 39.18 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling