Данное руководство устарело. Актуальное руководство: Руководство по Entity Framework Core 7
По умолчанию все типы сущностей, для которых определены в контексте данных наборы DbSet, включаются в модель и в дальнейшем сопоставляются с таблицами в базе данных. Но кроме того, в модель также включаются типы, на которые есть ссылки в сущностях, которые уже включены в модель, например, через свойства DbSet.
Например, пусть у нас определены следующие сущности:
public class Product { public int Id { get; set; } public string Name { get; set; } public int Price { get; set; } // навигационное свойство public Company Manufacturer { get; set; } } public class Company { public int Id { get; set; } public string Name { get; set; } } public class Country { public int Id { get; set; } public string Name { get; set; } }
И пусть у нас будет класс контекста данных:
public class ApplicationContext : DbContext { public DbSet<Product> Products { get; set; } public ApplicationContext() { Database.EnsureDeleted(); Database.EnsureCreated(); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=efbasicsappdb;Trusted_Connection=True;"); } }
После создания базы данных в ней будут созданы две таблицы: Products и Company.
Поскольку для типа Product определен набор DbSet, то для имени таблицы будет применяться имя этого набора, а для второй таблицы будет использоваться имя класса Company.
Еще один способ включения сущности в модель представляет вызов Entity()
объекта ModelBuilder в методе OnModelCreating()
:
public class ApplicationContext : DbContext { public DbSet<Product> Products { get; set; } public ApplicationContext() { Database.EnsureDeleted(); Database.EnsureCreated(); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=efbasicsappdb;Trusted_Connection=True;"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Country>(); } }
И если мы сейчас создадим и выполним миграции, то в базе данных будут уже три таблицы:
Иногда возникают ситуации, когда надо, наоборот, исключить сущность из модели. Например, в примере выше сущность Product ссылается на класс Company, и, допустим, мы не хотим, чтобы в базе данных была таблица Company. В этом случае мы можем использовать Fluent API или аннотации данных.
Применение Fluent API заключается в вызове метода Ignore():
public class ApplicationContext : DbContext { public DbSet<Product> Products { get; set; } public ApplicationContext() { Database.EnsureDeleted(); Database.EnsureCreated(); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Ignore<Company>(); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=efbasicsappdb;Trusted_Connection=True;"); } }
Аннотации данных предполагают установку над классом атрибута [NotMapped]:
using System.ComponentModel.DataAnnotations.Schema; public class Product { public int Id { get; set; } public string Name { get; set; } public int Price { get; set; } // навигационное свойство public Company Manufacturer { get; set; } } [NotMapped] public class Company { public int Id { get; set; } public string Name { get; set; } }
При исключении сущности Company в базе данных будет только одна таблица Products, причем она не будет содержать столбца, который бы сопоставлялся со свойством Manufacturer класса Product: