Определение моделей

Данное руководство устарело. Актуальное руководство: Руководство по Entity Framework Core 7

Последнее обновление: 15.11.2020

Включение сущностей в модель

По умолчанию все типы сущностей, для которых определены в контексте данных наборы 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.

Навигационное свойство в Entity Framework Core

Поскольку для типа 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>();
    }
}

И если мы сейчас создадим и выполним миграции, то в базе данных будут уже три таблицы:

Fluent API в Entity Framework Core

Исключение из модели

Иногда возникают ситуации, когда надо, наоборот, исключить сущность из модели. Например, в примере выше сущность 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:

Добавление моделей в Entity Framework Core
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850