![]()  | 
    Neste artigo veremos como usar o Entity Framework Core (EF Core) como banco de dados In-Memory para o ASP .NET Core. | 
Uma das novidades do EF Core é a adição de um provedor de dados in-memory que torna possível prototipar aplicações e escrever testes sem ter que configurar um banco de dados local ou externo. Assim, quando você terminar os testes e estiver pronto para trocar para o seu banco de dados de produção, basta simplesmente trocar o provedor usado.
Neste artigo eu vou mostrar como configurar o EF Core para usar o provedor in-Memory e usá-lo em uma aplicação ASP .NET Core.
Neste artigo eu vou usar o VS 2017 para criar uma aplicação ASP .NET Core usando o template Web API, mas você pode usar o VS Code ou VS for Mac conforme eu mostrei nestes artigos:
ASP .NET Core - Acessando o banco de dados PostGreSQL no MacOS com VS for Mac - I
ASP .NET Core - Criando uma aplicação ASP .NET Core MVC com o VS 2017 - I
Para acompanhar este artigo você precisa ter instalado o Visual Studio Community 2017 com os seguintes workloads instalados:

Recurso utilizados :
Criando o projeto ASP .NET Core
Abra no VS 2017 e no menu File clique em New Project;
A seguir selecione o template Visual C# -> .NET Core e marque ASP .NET Core Web Application (.NET Core);

Informe o nome AspnetCore_EFCoreInMemory e clique em OK;

A seguir selecione o template Web API, sem autenticação e sem usar o suporte ao Docker.
Instalando o Entity Framework Core In-Memory no projeto
Vamos agora instalar o EF Core em nosso projeto via Nuget. No menu Tools-> Nuget Package Manager clique em Manage Nuget Packages for Solution;
Selecione o pacote para Microsoft.EntityFrameworkCore.InMemory e instale no projeto:

Definindo o modelo de entidades e o contexto
A seguir vamos criar uma pasta Models no projeto e definir um modelo de entidades e o contexto para testar o EF Core In-Memory.
Vamos criar as seguintes classes na pasta Models:
1 - Usuario.cs - Representa um usuário que pode ter uma lista de posts
| 
		using System.Collections.Generic; 
		namespace AspnetCore_EFCoreInMemory.Models  | 
	
2- Post.cs - Representa um post feito por um usuário
| 
		namespace AspnetCore_EFCoreInMemory.Models { public class Post { public string Id { get; set; } public string Usuariod { get; set; } public string Conteudo { get; set; } 
		                public Usuario Usuario { get; set; }  | 
	
3 - ApiContext.cs - Representa o contexto das entidades e herda da classe DbContext definindo o mapeamento entre as entidades e as tabelas e a conexão com o banco de dados:
| 
		using Microsoft.EntityFrameworkCore; 
		namespace AspnetCore_EFCoreInMemory.Models                 public DbSet<Usuario> Usuarios { get; set; }  | 
	
Essas classes representam os dados que serão salvos e carregados a partir do banco de dados. Temos aqui um relacionamento um-para-muitos entre Usuarios e Posts onde um Post pertence a um Usuario, e um Usuario pode ter muitos Posts.
As propriedades Posts e Usuarios serão automaticamente preenchidas pelo EF Core.
Configurando o EF Core In-Memory na aplicação
Vamos agora conectar este contexto do banco de dados com a nossa aplicação usando o provedor in-memory.
Abra a classe Startup.cs do projeto e no método ConfigureServices inclua o código a seguir:
| 
		using AspnetCore_EFCoreInMemory.Models; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; ...                 // This method gets called by the runtime. Use this method to add services to the container.                               // Add framework services.  | 
	
Incluindo dados de testes
Vamos agora incluir alguns dados de testes no banco de dados in-memory quando a aplicação for inicializada.
Para isso vamos abrir o arquivo Startup.cs e incluir o código abaixo no método Configure:
| 
		                                   ... // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); 
		                                 var context = app.ApplicationServices.GetService<ApiContext>();                         app.UseMvc();  | 
	
Agora vamos incluir o método AdicionarDadosTeste() no método Configure:
| 
		              private static void AdicionarDadosTeste(ApiContext context) { var testeUsuario1 = new Models.Usuario { Id = "usuario1", Nome = "Macoratti", Email = "macoratti@yahoo.com" }; context.Usuarios.Add(testeUsuario1);                         var testePost1 = new Models.Post context.Posts.Add(testePost1);                         context.SaveChanges();  | 
	
Criando a Web API para retornar os dados
Para poder retornar os dados podemos criar uma Web API definindo um controlador na pasta Controllers para o nosso modelo de entidades e contexto.
Nota: Poderíamos ter criado um projeto MVC com páginas usando Scaffolding.
Clique com o botão direito do mouse sobre a pasta Controllers e a seguir clique em Add Controller;
Marque a opção Minimal Dependencies e clique em Add;

Repita o procedimento e marque agora a opção API Controller - Empty e clique em Add:

Informe o nome UsuariosController e clique em Add.
Defina o código abaixo no arquivo UsuariosController:
| 
		 
			using 
			AspnetCore_EFCoreInMemory.Models; 
			namespace 
			AspnetCore_EFCoreInMemory.Controllers 
			        
			public UsuariosController(ApiContext context) 
			        
			public async Task<IActionResult> Get() 
			            
			var resposta = usuarios.Select(u => new 
			            
			return Ok(resposta);  | 
	
Vamos entender o código:
- Temos um objeto ApiContext requisitado a partir do serviço de injeção de dependência no construtor que expõe a rota HTTP GET retornando todos os usuários e seus posts armazenados no banco de dados.
- No método Get(), o método Include() informa explicitamente ao EF Core para carregar os posts dos usuários com seus outros detalhes. O EF Core sabe que o campo UsuarioId no modelo Post representa uma chave estrangeira para o relacionamento entre Usuarios e Posts.
- Depois que os usuários e posts são retornados de forma assíncrona do banco de dados, o array é projetado (usando Select) incluindo somente os campos que precisamos para retornar um JSON mais enxuto.
Testando a aplicação
Para testar a aplicação execute o projeto e digite na URL a rota definida no mapeamento : http://localhost:4333/api/usuarios
Ao final do processamento teremos o seguinte resultado:

E assim acabamos de criar uma aplicação usando o Entity Framework Core In-Memory, após testar basta alterar o provedor usado no projeto para o do seu banco de dados. Além disso você também pode realizar testes de integração usando este recurso.
Pegue o projeto completo aqui :  
AspnetCore_EFCoreInMemory.zip
E agora, filhinhos, permanecei nele(Jesus); para que, quando ele se manifestar, tenhamos confiança, e não sejamos confundidos por ele na sua vinda. 1 João 2:28