Categorias
.NET Core Banco de Dados C# Entity Framework SQL Server

C#: usando Skip e Take com Entity Framework Core e SQL Server 2005 ou 2008

Requisitos

  • .NET Core Runtime 2.2.8 e SDK 2.2.207
  • SQL Server 2008 Express

Simulando o problema

  • Abra o Visual Studio Code,
  • Crie e abra a pasta C:\GitHub\tiagopariz\CSharpEFSkipTakeSql2005e2008,
  • Execute os comandos a seguir:

  • Na pasta C:\GitHub\tiagopariz\CSharpEFSkipTakeSql2005e2008\src\CSharpEFSkipTakeSql2005e2008.Prompt adicione o arquivo appsettings.json,

  • Edite o arquivo de projeto CSharpEFSkipTakeSql2005e2008.Prompt.csproj, incluindo a referência ao arquivo appsettings.json,

  • Na pasta C:\GitHub\tiagopariz\CSharpEFSkipTakeSql2005e2008\src\CSharpEFSkipTakeSql2005e2008.Prompt adicione o arquivo Person.cs,

  • Na pasta C:\GitHub\tiagopariz\CSharpEFSkipTakeSql2005e2008\src\CSharpEFSkipTakeSql2005e2008.Prompt adicione o arquivo SkipTakeContext.cs,

  • Abra o terminal e digite os comandos a seguir para criar o banco,

  • Inclua umas 20 linhas de dados,

  • Altere a classe Program.cs, ordenando por nome listando os primeiros 10 registros (Take(10)) e pulando os dois primeiros (Skip(2)),

  • Execute o projeto com o comando a seguir,

  • A seguinte mensagem de erro será exibida:

  • O erro ocorre quando o Entity Framework Core tenta executar a seguinte consulta:

A clausula OFFSET é um recurso do SQL Server 2012 e que é a forma padrão do .NET Core criar consultas usando Take e Skip.

No SQL Server 2008 temos a função Row_Number() que atende o Take e Skip. Então, para que o EF Core use esta função, precisamos fazer um ajuste mínimo na classe de contexto.

Ajustando o DbContext

  • Edite o arquivo SkipTakeContext.cs, e no método OnConfiguring() edite a linha optionsBuilder.UseSqlServer(_connectionString) para que o Entity Framework Core use a função Row_Number() no lugar da claúsula OFFSET,

  • Execute novamente a aplicação:

  • Agora os resultados serão exibidos corretamente,

.NET Core 3.0 ou superior

Não há suporte para SQL Server 2005 e 2008 a partir do .NET Core 3.0.

Repositório no GitHub

https://github.com/tiagopariz/CSharpEFSkipTakeSql2005e2008

Categorias
C# Entity Framework Programação Visual Studio

Entity Framework: migrations com vários projetos e bancos de dados

Quando trabalhamos com soluções grandes, onde há vários projetos e cada um tem sua própria base de dados, assim como seu próprio versionamento usando Migrations do Entity Framework, fica meio complicado ficar alterando o Set as startup project e o Default Project na janela do Package Manager Console. Então, o ideal é apontar os projetos de configuração e dados na mesma linha de comando do Add-Migration e Update-Database.

Atualizando o banco de dados

Quando abrimos uma projeto que já tem migrations, precisamos atualizar o banco de dados, e para isso usamos o comando Update-Database. Mas podemos ser mais específico, e não precisar escolher nada em tela para que ele saiba onde achar a Connection String e Contexto, usando o comando abaixo.

Update-Database

Este comando atualiza o banco de dados com a ultima versão das migrations registradas, assim como roda algum Seed que pode popular tabelas.

-ProjectName

Nome do projeto onde está a configuração das entidades que representam os objetos do banco de dados, ou os DbSets.

-StartUpProjectName

O projeto que contém a Connection String para conexão com o banco de dados.

-ConfigurationTypeName

Nome completo, incluindo as namespaces, da entidade de configuração das migrations. Este arquivo é aquele que é gerado automaticamente ao usar o comando Enable-Migrations para ativar as migrações.

-Verbose

Este parâmetro exibe na tela todas as alterações efetuadas, assim como configurações definidas nos parâmetros anteriores.

Adicionando uma nova migração

Após atualizar o banco de dados, fazer as alterações nos objetos de domínio, precisamos adicionar a migração para depois enviar ao banco de dados as alterações versionadas, e novamente, é preciso que não precisemos definir o projeto de inicialização e dados. Para isso, use o comando a seguir:

Além dos parâmetros -ProjectName, -StartUpProjectName e -ConfigurationTypeName que já foram explicados no tópico anterior, precisamos incluir o parâmetro -Name e definir um nome que identifique qual alteração será feita no banco de dados.

Após adicionar a migration, só é preciso digitar o comando Update-Database com os parâmetros corretos.