Начинаем работу с ASP.NET Core и Entity Framework 6

Paweł Grudzień, Damien Pontifex

В этой статье мы покажем вам, как использовать Entity Framework 6 в ASP.NET Core приложении.

+.. contents:: Разделы: + :local: + :depth: 1

Введение

Прежде чем мы начнем, убедитесь, что вы компилируете, используя .NET Framework, поскольку Entity Framework 6 не поддерживает .NET Core. Если вам нужен кроссплатформенный функционал, то вам необходим `Entity Framework Core`_.

В файле project.json укажите одну цель для всего .NET Framework:

"frameworks": {
    "net46": {}
}

Настройка строк соединений и внедрения зависимостей

Проще всего напрямую получать строки соединений и настраивать внедрение зависимостей экземпляра DbContext.

В подклассе DbContext должен быть конструктор, который принимает строку соединения:

1
2
3
4
5
6
public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(string nameOrConnectionString) : base(nameOrConnectionString)
    {
    }
}

В классе Startup внутри ConfigureServices надо добавить фабричный контекстный метод со строкой соединения. Определенный контекст должен использоваться в одной области видимости, чтобы Entity Framework эффективно и надежно работал.

1
2
3
4
5
6
public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped((_) => new ApplicationDbContext(Configuration["Data:DefaultConnection:ConnectionString"]));

    // Configure remaining services
}

Миграция настроек из файла конфигурации в код

Entity Framework 6 делает возможным, чтобы конфигурация была определена в xml (в web.config или app.config) или в коде. Что касается ASP.NET Core, то вся конфигурация основана на коде.

Чтобы работать с такой конфигурацией, надо создать подкласс System.Data.Entity.Config.DbConfiguration и применить System.Data.Entity.DbConfigurationTypeAttribute к подклассу DbContext.

Наш файл config обычно выглядит вот так:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
        <parameters>
            <parameter value="mssqllocaldb" />
        </parameters>
    </defaultConnectionFactory>
    <providers>
        <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
</entityFramework>

Элемент defaultConnectionFactory настраивает фабрику для соединений. Если этот атрибут не установлен, тогда значением по умолчанию будет SqlConnectionProvider. А с другой стороны, если значение установлено, данный класс будет использоваться для создания DbConnection с его методом CreateConnection. Если у данной фабрики нет конструктора по умолчанию, тогда вы должны добавить параметры, которые должны сконструировать объект.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[DbConfigurationType(typeof(CodeConfig))] // point to the class that inherit from DbConfiguration
public class ApplicationDbContext : DbContext
{
    [...]
}

public class CodeConfig : DbConfiguration
{
    public CodeConfig()
    {
        SetProviderServices("System.Data.SqlClient",
            System.Data.Entity.SqlServer.SqlProviderServices.Instance);
    }
}

SQL Server, SQL Server Express и LocalDB

Класс CodeConfig выше может быть использован, чтобы напрямую настроить сервисы провайдера и соответствующие строки соединения, которые должны быть переданы конструктору DbContext, как показано выше.

Резюме

Entity Framework 6 является ORM библиотекой, которая легко способна объединять классы с сущностями БД. Эти возможности делают EF очень популярным, так что миграция больших частей кода для многих проектов нежелательна. В этой статье мы показали, как избегать миграцию, чтобы фокусироваться на других новых возможностях ASP.NET.

Дополнительные ресурсы

Поделись хорошей новостью с друзьями!
Следи за новостями!