ASP.NET Core e Entity Framework 6

Observação

Esta não é a versão mais recente deste artigo. Para informações sobre a versão vigente, confira a Versão do .NET 8 deste artigo.

Importante

Essas informações relacionam-se ao produto de pré-lançamento, que poderá ser substancialmente modificado antes do lançamento comercial. A Microsoft não oferece nenhuma garantia, explícita ou implícita, quanto às informações fornecidas aqui.

Para informações sobre a versão vigente, confira a Versão do .NET 8 deste artigo.

Por Patrick Goode

Usando o Entity Framework 6 com ASP.NET Core

O Entity Framework Core deve ser usado para o novo desenvolvimento. O exemplo de download usa o EF6 (Entity Framework 6), que pode ser usado para migrar aplicativos existentes para ASP.NET Core.

Recursos adicionais

Por Paweł Grudzień e Damien Pontifex

Este artigo mostra como usar o Entity Framework 6 em um aplicativo ASP.NET Core.

Visão geral

Para usar o Entity Framework 6, o projeto precisa ser compilado no .NET Framework, pois o Entity Framework 6 não dá suporte ao .NET Core. Caso precise de recursos de multiplataforma, faça upgrade para o Entity Framework Core.

A maneira recomendada de usar o Entity Framework 6 em um aplicativo ASP.NET Core é colocar o contexto e as classes de modelo do EF6 em um projeto de biblioteca de classes direcionado ao .NET Framework. Adicione uma referência à biblioteca de classes do projeto ASP.NET Core. Consulte a solução de exemplo do Visual Studio com projetos EF6 e ASP.NET Core.

Não é possível colocar um contexto do EF6 em um projeto ASP.NET Core, pois projetos .NET Core não dão suporte a todas as funcionalidades exigidas pelo EF6, como Enable-Migrations, que é obrigatória.

Seja qual for o tipo de projeto em que você localize o contexto do EF6, somente ferramentas de linha de comando do EF6 funcionam com um contexto do EF6. Por exemplo, Scaffold-DbContext está disponível apenas no Entity Framework Core. Caso precise fazer engenharia reversa de um banco de dados para um modelo do EF6, consulte Usar o Code First para um banco de dados existente.

Referenciar a estrutura completa e o EF6 no projeto ASP.NET Core

O projeto ASP.NET Core precisa ter como destino o .NET Framework e fazer referência ao EF6. Por exemplo, o arquivo .csproj do projeto ASP.NET Core será semelhante ao exemplo a seguir (somente as partes relevantes do arquivo são mostradas).

<PropertyGroup>
  <TargetFramework>net452</TargetFramework>
  <PreserveCompilationContext>true</PreserveCompilationContext>
  <AssemblyName>MVCCore</AssemblyName>
  <OutputType>Exe</OutputType>
  <PackageId>MVCCore</PackageId>
</PropertyGroup>

Ao criar um novo projeto, use o modelo Aplicativo Web ASP.NET Core (.NET Framework).

Manipular as cadeias de conexão

As ferramentas de linha de comando do EF6 que você usará no projeto de biblioteca de classes do EF6 exigem um construtor padrão para que possam criar uma instância do contexto. No entanto, provavelmente, você desejará especificar a cadeia de conexão a ser usada no projeto ASP.NET Core, caso em que o construtor de contexto deve ter um parâmetro que permita passar a cadeia de conexão. Veja um exemplo.

public class SchoolContext : DbContext
{
    public SchoolContext(string connString) : base(connString)
    {
    }

Como o contexto do EF6 não tem um construtor sem parâmetros, o projeto do EF6 precisa fornecer uma implementação de IDbContextFactory<TContext>. As ferramentas de linha de comando do EF6 encontrarão e usarão essa implementação para que possam criar uma instância do contexto. Veja um exemplo.

public class SchoolContextFactory : IDbContextFactory<SchoolContext>
{
    public SchoolContext Create()
    {
        return new EF6.SchoolContext("Server=(localdb)\\mssqllocaldb;Database=EF6MVCCore;Trusted_Connection=True;MultipleActiveResultSets=true");
    }
}

Nesse código de exemplo, a implementação IDbContextFactory passa uma cadeia de conexão embutida em código. Essa é a cadeia de conexão que será usada pelas ferramentas de linha de comando. Recomendamos implementar uma estratégia para garantir que a biblioteca de classes use a mesma cadeia de conexão usada pelo aplicativo de chamada. Por exemplo, você pode obter o valor de uma variável de ambiente em ambos os projetos.

Configurar a injeção de dependência no projeto ASP.NET Core

No arquivo Startup.cs do projeto Core, configure o contexto do EF6 para DI (injeção de dependência) em ConfigureServices. Os objetos de contexto do EF devem ser delimitados em escopo a um tempo de vida por solicitação.

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();
    services.AddScoped<SchoolContext>(_ => new SchoolContext(Configuration.GetConnectionString("DefaultConnection")));
}

Em seguida, você pode obter uma instância do contexto nos controladores usando a DI. O código é semelhante ao que você escreverá para um contexto do EF Core:

public class StudentsController : Controller
{
    private readonly SchoolContext _context;

    public StudentsController(SchoolContext context)
    {
        _context = context;
    }

Aplicativo de exemplo

Para obter um aplicativo de exemplo funcional, consulte a solução de exemplo do Visual Studio que acompanha este artigo.

Esta amostra pode ser criada do zero pelas seguintes etapas no Visual Studio:

  • Crie uma solução.

  • Adicionar>Novo Projeto>Web>Aplicativo Web ASP.NET Core

    • Na caixa de diálogo de seleção de modelo do projeto, selecione API e .NET Framework na lista suspensa
  • Adicionar>Novo Projeto>Windows Desktop>Biblioteca de Classes (.NET Framework)

  • No PMC (Console do Gerenciador de Pacotes) dos dois projetos, execute o comando Install-Package Entityframework.

  • No projeto de biblioteca de classes, crie classes de modelo de dados e uma classe de contexto, bem como uma implementação de IDbContextFactory.

  • No PMC do projeto de biblioteca de classes, execute os comandos Enable-Migrations e Add-Migration Initial. Caso tenha definido o projeto ASP.NET Core como o projeto de inicialização, adicione -StartupProjectName EF6 a esses comandos.

  • No projeto Core, adicione uma referência de projeto ao projeto de biblioteca de classes.

  • No projeto Core, em Startup.cs, registre o contexto para DI.

  • No projeto Core, em appsettings.json, adicione a cadeia de conexão.

  • No projeto Core, adicione um controlador e exibições para verificar se é possível ler e gravar dados. (Observe que o scaffolding do ASP.NET Core MVC não funcionará com o contexto do EF6 referenciado da biblioteca de classes.)