Entity Framework Core от Microsoft е кросплатформена, лека и гъвкава версия на своя предшественик, Entity Framework. EF Core е инструмент за обектно-релационни карти (ORM), който предлага стандартизиран начин за съхранение и извличане на данни към и от различни източници на данни.
Чрез програмиране спрямо концептуален, а не релационен модел. В резултат на това няма несъответствие на импеданса между това как данните се представят в приложението и как се съхраняват в базата данни.
Наследяването е характеристика на обектно-ориентираното програмиране, която ви позволява да създавате подкласове от базов клас, като по този начин разширявате характеристиките на базовия клас. Entity Framework Core осигурява отлична поддръжка за наследяване. Тази статия говори за това как можем да приложим наследяването в Entity Framework Core. Ще се възползваме от EntityDeveloper, за да говорим с базата данни.
Предварителни условия
За да можете да работите с примерите за код, демонстрирани в тази статия, трябва да имате инсталирано следното във вашата система:
- Visual Studio 2019 Community Edition (изтегляне)
- dotConnect за PostgreSQL (изтегляне)
- Разработчик на обект
Можете да изтеглите копие на Entity Developer (пробна версия) от тук:https://www.devart.com/entitydeveloper/download.html.
Създайте база данни
Сега, когато проектът ASP.NET Core Web API е създаден във Visual Studio 2019; следващата стъпка е да създадете базата данни. Имайте предвид, че с цел простота ще използваме база данни с няколко две таблици с прости дизайни в този пример. Създайте база данни, наречена Демо, и създайте три таблици (Person, User и Manager) в нея. Полетата в тези таблици трябва да се съпоставят със свойствата на моделните класове, показани по-късно в тази статия.
Създайте нов ASP.NET Core Web API проект
Ако приемем, че на вашия компютър е инсталиран необходимият софтуер, за да можете да работите с Entity Developer, следвайте стъпките, описани по-долу, за да създадете нов проект за уеб API на ASP.NET Core.
1. Първо отворете Visual Studio 2019 IDE.
2. След това щракнете върху Създаване на нов проект след като IDE се зареди.
3. Щракнете върху Създаване на нов проект .
4. След това изберете ASP.NET Core уеб приложение .
5. Щракнете върху Напред .
6. Посочете името на проекта и местоположението – където трябва да се съхранява във вашата система.
7. По желание щракнете върху Поставяне на решението и проекта в една и съща директория квадратче за отметка.
8. След това щракнете върху Създаване .
9. В Създаване на ново уеб приложение ASP.NET Core диалогов прозорец, който се показва следващият, изберете API като шаблон на проекта.
10. Изберете ASP.NET Core 3.1 или по-нова версия като версия.
11. Трябва да деактивирате Конфигуриране за HTTPS и Активиране на поддръжката на Docker опции, като деактивирате съответните квадратчета за отметка.
12. Тъй като няма да използваме удостоверяване в този пример, посочете удостоверяването като Без удостоверяване .
13. Накрая кликнете върху Създаване бутон, за да завършите процеса.
Създайте модел на данни на обект
Следващото нещо, което трябва да направите, е да създадете модел на данни за обект. Когато създавате модел в Entity Developer, има две опции, от които да избирате:Database First (това е избрано по подразбиране) и Model First. В този пример ще се възползваме от подхода Database First. Не забравяйте да изберете Генериране от база данни опция за генериране на вашия модел от базата данни и избор на обектите на базата данни, които бихте искали да бъдат част от вашия модел на данни на обекта.
Следвайте тези стъпки, описани по-долу, за да създадете модел на данни на обект в Entity Developer, като използвате подхода на базата данни.
1. Изберете своя проект в Solution Explorer Прозорец.
2. Щракнете с десния бутон и изберете Добавяне>Нов артикул .
3. Изберете Devart EF Core Model като шаблона, както е показано по-долу.
4. Посочете име за модела на данните на обекта и щракнете върху Добавяне .
5. Посочете свойствата на връзката и тествайте връзката.
6. Щракнете върху Напред продължавам.
7. По подразбиране ще бъде избрана опцията “Генериране от база данни”. Тъй като искаме моделът да бъде създаден от базата данни, щракнете върху Напред продължавам.
8. Премахнете избора от всички опции и след това посочете само обектите на базата данни, които искате да бъдат част от модела. Ето къде трябва да изберете таблиците с продукти и категории.
9. В Настройка правила за именуване екран, можете по избор да зададете правила за именуване за вашите обекти.
10. В следващия екран можете по желание да посочите свойствата на модела.
11. В следващия екран можете по избор да изберете съдържанието на диаграмата на модела.
12. В следващия екран можете по избор да посочите шаблони за генериране на код.
13. Посочете шаблона за генериране на код по ваш избор.
14. Накрая щракнете върху Край за да завършите процеса.
Вашият ADO.NET Entity Data Model с помощта на Entity Developer ще бъде създаден заедно с контекста на данните и класовете на модела.
Наследяване в ядрото на Entity Framework
Entity Framework Core (EF Core) ви позволява да картографирате йерархия на .NET клас към база данни. Следователно можете да създадете вашите .NET обекти, представени като основни и производни типове, а EF Core може да генерира схемата на базата данни за вас. Въпреки това, тъй като EF Core не търси автоматично базови или производни класове, трябва изрично да декларирате тип CLR във вашия модел, ако искате той да бъде съпоставен. Трябва да се отбележи, че посочването само на основния тип няма да е достатъчно, т.е. няма да принуди автоматично EF Core да включва всички подтипове.
Следният списък с кодове илюстрира как можете да създадете персонализиран контекст на данни за клас, както и за неговия подклас.
public class DemoDbContext : DbContext {
public DbSet<Person> Person { get; set; }
public DbSet<Author> Authors { get; set; }
}
public class Person {
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Author : Person {
public string SubjectArea { get; set; }
}
Таблица на йерархия (TPH)
В типа на наследяване на таблица на йерархия (TPH) (това е типът на наследяване по подразбиране в EF Core) ще имате само една таблица за цялата йерархия, която да представя всички класове. За да се разграничат различните типове, се използва колона „дискриминатор“. По подразбиране таблицата е кръстена на основния клас или на DbSet поле, свързано с нея. Името на таблицата ще бъде името на основния клас или съответния му атрибут DbSet по подразбиране.
Следният кодов фрагмент илюстрира как може да бъде представена таблица на йерархия:
public abstract class Person {
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class User : Person {
public string UserName { get; set; }
public string Password { get; set; }
}
public class Manager : Person {
public string Department { get; set; }
}
Таблица по тип (TPT)
Отношенията за наследяване на подхода Таблица по тип (TPT) са изобразени като външни ключове. При този подход отделна таблица представя всеки тип (включително абстрактни типове) от веригата на наследяване. Външните ключове се използват за свързване на таблици, които представляват извлечени типове с техния основен тип. В тази стратегия EF Core създава базова таблица в базата данни и множество таблици, специфични за всеки извлечен тип.
Следният списък с кодове показва как може да се приложи подходът Table Per Type (TPT):
public abstract class Person {
public int Id { get; set; }
public string FullName { get; set; }
}
[Table("Users")]
public class User : Person {
public string UserName { get; set; }
public string Password { get; set; }
}
[Table("Managers")]
public class Manager : Person {
public string Department { get; set; }
}
Таблица по тип бетон (TPC)
В подхода Таблица за конкретен тип (TPC) всеки конкретен тип във веригата на наследяване е представен от отделна таблица в базата данни, но не и от абстрактния клас. Свойствата на всеки абстрактен базов тип се създават като полета в таблицата на всеки конкретен тип.
Дизайнът на класа ще бъде същият като TPH. Ето как можете да посочите таблица за всеки от подкласовете:
public class MyDbContext : DbContext {
public DbSet<Person> Person { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Entity<User>().Map(m => {
m.MapInheritedProperties();
m.ToTable("Users");
});
modelBuilder.Entity<Author>().Map(m => {
m.MapInheritedProperties();
m.ToTable("Managers");
});
}
}
Резюме
Entity Framework Core може да се изпълнява на всяка платформа, която поддържа .NET Standard 2.1. Това включва .NET Core 3.1, както и .NET 5. Въпреки това, той няма да се изпълнява на .NET Standard 2.0, което предполага, че започвайки с EF Core 5.0, няма да можете да използвате EF Core с .NET Framework. Приятно четене!