O novo Fornecedor principal da EF abre a porta para algumas integrações poderosas do .NET: mesmo aquelas tradicionalmente vinculadas a bancos de dados relacionais. Esta postagem explica como Identidade, GraphQL e OData funcionam com o Couchbase.
Nesta postagem, vou falar sobre três integrações avançadas do EF Core que testei com sucesso com o Couchbase:
-
- Identidade do ASP.NET Core
- GraphQL (via Hot Chocolate)
- Dados OD
Observação: Essas integrações são baseadas em testes limitados e não são oficialmente suportadas (ainda). Sua milhagem pode variar, mas, até o momento, elas são bastante promissoras.
Identidade do ASP.NET Core
Microsoft.AspNetCore.Identity.EntityFrameworkCore fornece um sistema plug-and-play de autenticação e gerenciamento de usuários para aplicativos ASP.NET.
O provedor EF Core do Couchbase funciona bem com ele. A única ressalva é que você precisará garantir que o primeiro existem coleções adequadas (como AspNetUsers, AspNetRoles, etc.).
Observação: Você deve criar as seguintes coleções com antecedência: AspNetUsers, AspNetRoles, AspNetUserRoles, AspNetUserClaims, AspNetUserLogins, AspNetUserTokens, AspNetRoleClaims.
Exemplo de configuração de EF
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class AppDbContext : IdentityDbContext<ApplicationUser> { public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); builder.Entity<ApplicationUser>().ToCouchbaseCollection(this, "AspNetUsers"); builder.Entity<IdentityRole>().ToCouchbaseCollection(this, "AspNetRoles"); builder.Entity<IdentityUserRole<string>>().ToCouchbaseCollection(this, "AspNetUserRoles"); builder.Entity<IdentityUserClaim<string>>().ToCouchbaseCollection(this, "AspNetUserClaims"); builder.Entity<IdentityUserLogin<string>>().ToCouchbaseCollection(this, "AspNetUserLogins"); builder.Entity<IdentityUserToken<string>>().ToCouchbaseCollection(this, "AspNetUserTokens"); builder.Entity<IdentityRoleClaim<string>>().ToCouchbaseCollection(this, "AspNetRoleClaims"); } } public class ApplicationUser : IdentityUser { } |
Exemplo de autenticação MVC
Aqui está um controlador ASP.NET Core MVC com registro, login e logout, bem como uma função personalizada:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
public class AuthController : Controller { private readonly UserManager<ApplicationUser> _userManager; private readonly SignInManager<ApplicationUser> _signInManager; private readonly RoleManager<IdentityRole> _roleManager; public AuthController(UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager, RoleManager<IdentityRole> roleManager) { _userManager = userManager; _signInManager = signInManager; _roleManager = roleManager; } public IActionResult Register() => View(); [HttpPost] public async Task<IActionResult> Register(RegisterModel model) { if (!ModelState.IsValid) return View(model); var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { var roleName = "CustomRole"; if (!await _roleManager.RoleExistsAsync(roleName)) await _roleManager.CreateAsync(new IdentityRole(roleName)); await _userManager.AddToRoleAsync(user, roleName); await _signInManager.SignInAsync(user, isPersistent: false); return RedirectToAction("Index", "Home"); } foreach (var error in result.Errors) ModelState.AddModelError("", error.Description); return View(model); } public IActionResult Login() => View(); [HttpPost] public async Task<IActionResult> Login(LoginModel model) { if (!ModelState.IsValid) return View(model); var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, false, false); if (result.Succeeded) return RedirectToAction("Index", "Home"); ModelState.AddModelError("", "Invalid login attempt."); return View(model); } public async Task<IActionResult> Logout() { await _signInManager.SignOutAsync(); return RedirectToAction("Index", "Home"); } } |
Os dados seguem a estrutura padrão do Identity, armazenados em um documento do Couchbase. Por exemplo, um documento em Usuário AspNet coleção:

GraphQL com chocolate quente
Chocolate quente é um servidor GraphQL popular para .NET. Ele pode se integrar ao EF Core, apoiando-se nos recursos LINQ do provedor (que o Couchbase tem). Isso significa que as consultas GraphQL são traduzidas para LINQ, que, por sua vez, é traduzido para o Couchbase SQL++.
Configuração
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class WidgetQuery { [UseFiltering] [UseSorting] public IQueryable<Widget> GetWidgets([Service] WidgetDbContext dbContext) => dbContext.Widgets; } // Program.cs: builder.Services .AddGraphQLServer() .AddQueryType<WidgetQuery>() .AddFiltering() .AddSorting() .AddProjections(); app.MapGraphQL(); |
Exemplo de uso
- Ir para /graphql no navegador (isso abre uma interface da Web)
- Tente uma consulta como esta:
|
1 2 3 4 5 6 7 8 9 |
query { widgets(where: { name: { contains: "foo" } }, order: { createdDt: DESC }) { id name price numInStock createdDt } } |
Isso retornará resultados como:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "data": { "widgets": [ { "id": "b5c494fe-135f-4f01-bf12-6e4ad1eee829", "name": "foobar", "price": 1.99, "numInStock": 50, "createdDt": "2025-06-18T18:11:19.149Z" } ] } } |
Dicas
-
- As consultas GraphQL precisam corresponder aos seus índices GSI (são apenas consultas SQL++ por baixo do pano).
- Você pode usar índices de capa e outros índices do SQL++ para melhorar o desempenho.
Dados OD
Microsoft.AspNetCore.OData expõe seus dados do EF Core como pontos de extremidade OData, facilitando a conexão de ferramentas como Excel, Power BI e Tableau ao Couchbase.
Programa de amostra.cs
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
builder.Services.AddControllersWithViews() .AddOData(opt => { var odataBuilder = new ODataConventionModelBuilder(); odataBuilder.EntitySet<Widget>("Widgets"); opt.AddRouteComponents("odata", odataBuilder.GetEdmModel()) .Filter() .OrderBy() .Select() .Expand() .Count() .SetMaxTop(100); }); |
Controlador
|
1 2 3 |
[HttpGet("/odata/Widgets")] [EnableQuery] public IQueryable<Widget> GetOData() => _context.Widgets; |
Exemplo de consultas OData
-
- https://localhost:7037/odata/Widgets?$filter=price gt 1&$orderby=name
- https://localhost:7037/odata/Widgets?$select=name,price&$top=10

Observação: Certifique-se de que suas consultas LINQ do EF Core possam ser traduzidas para SQL++ e que todos os campos filtrados/classificados sejam indexados no Couchbase.
Concluindo
Todas essas integrações são respaldadas pelo EF Core - e agora, com o suporte do Couchbase, você pode tirar o máximo proveito delas em seu código. Se estiver criando aplicativos da Web seguros, APIs GraphQL ou integrando-se a ferramentas de BI, a combinação EF Core e Couchbase torna isso possível.
Curioso para ver mais? Diga-nos quais integrações você gostaria de explorar a seguir!