Entity Framework Core e Azure CosmoDB

Nesse nova atualização (que ainda seja um preview) do Entity Framework 2.2.0-preview2–35497 temos a oportunidade de trabalhar com o Azure CosmosDB tendo em mãos uma infraestrutura bem conhecida para aqueles que utilizam o ORM Entity Framework.

Entre as diversas vantagens estão:

  • Distribuição Global
  • Escalabilidade
  • Disponibilidade
  • Latência muito baixo ou inexistente
  • Automática indexação
Referencia: https://blogs.msdn.microsoft.com/dotnet/2018/09/12/announcing-entity-framework-core-2-2-preview-2/

Nesse tutorial, vamos focar na sua facilidade de instalação, configuração e utilização.

Instalação:

  • Package Manager Console

PM> Install-Package Microsoft.EntityFrameworkCore.Cosmos -Version 2.2.0-preview2-35497

ou

  • Manage Nugets Package

Observação: como é um pacote no modo preview assinale Include Prerelease como demonstrado na figura para que o pacote seja listado.

Configuração:

As configurações não são muito diferentes dos providers para bancos estruturados, tendo isso também como uma grande vantagem, ou seja, é muito fácil configurar o Azure CosmosDB como a infraestrutura ORM Entity Framework Core.

Primeiramente para testes locais pode utilizar o Azure Cosmos DB Emulator que é um programa de teste para esse banco instalado localmente em seu computador que facilita e muito no seu desenvolvimento.

Agora é codificar que para mim ficou bastante fácil, exemplo:

Cria um classe para representar o seu documento (ah documento, sim, banco de dados orientado a documentos, porque são bancos NoSQL, mas, que por causa da infraestrutura pode ser confundido com uma banco estruturado, e é sempre bom lembrar disso), exemplo class People :

namespace Models
{
public class People
{
public string Id { get; set; }
public string Name { get; set; }
public bool Active { get; set; }
public System.DateTime Created { get; set; }
}
}

A partir desse modelo vamos configurar o DbContext do Entity Framework Core:

namespace ConsoleApp.Database
{
public class DBCosmoContext: DbContext
{
public DbSet<People> People { get; set; }
protected override void
OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseCosmos(
ConfigurationDBCosmo.URI,
ConfigurationDBCosmo.PrimaryKey,
ConfigurationDBCosmo.DatabaseName,
options =>
{ }
);
}
protected override void
OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<People>(x =>
{
x.ToContainer("people");
});
}
}
}

Passos:

  • Colocar o modelo People no DbSet<People>.
  • Configurar OnConfiguration com os dados da conexão com esse banco, no exemplo eu crie um classe com constantes, mas, isso foi só pra facilitar, podendo utilizar uma melhor técnica para configurar esses dados de conectividade:
namespace Models
{
public static class ConfigurationDBCosmo
{
public const string DatabaseName = "DatabaseCosmo";
public const string URI = "https://localhost:8081";
public const string PrimaryKey = "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==";
public const string PrimaryConnectionString = "AccountEndpoint=https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==";
public const string MongoConnectionString = "mongodb://localhost:C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==@localhost:10255/admin?ssl=true";
}
}

esses dados foram obtidos nesse caso exemplo do emulator:

Configurações para conectividade

sendo que URI e Primary Key permite a conectividade com o banco.

  • Configurar OnModelCreating dizendo qual container ele pertence, não é obrigatório mas, o resultado obtido com o nome da coleção fica mais claro e padrão quando se tem muitas coleções de documentos.
Container People

Utilização:

Com todos códigos feitos e configurados, a maneira é idêntica aos outros bancos de dados, para inserir um novo registro:

using (DBCosmoContext db = new DBCosmoContext())
{
var p = new Models.People
{
Name = "None None",
Active = true,
Created = DateTime.Parse("01/01/1999")
};
db.People.Add(p);
db.SaveChanges();
}

para alterar um registro:

using (DBCosmoContext db = new DBCosmoContext())
{
var people = db.People
.Where(x => x.Id == "e62365d0-29a3-48ae-a968-b56ab42ee3c7")
.FirstOrDefault();
people.Active = true;
db.SaveChanges();
}

e assim por diante. As pesquisas também são muito fácil de fazer utilizando o Linq e isso é trivial para quem utiliza esse ORM.

Referencias: