El nuevo EF Proveedor principal abre la puerta a algunas potentes integraciones .NET: incluso aquellas tradicionalmente ligadas a bases de datos relacionales. Este artículo explica cómo funcionan Identity, GraphQL y OData con Couchbase.
En este artículo, repasaré tres integraciones avanzadas de EF Core que he probado con éxito con Couchbase:
-
- Identidad ASP.NET Core
- GraphQL (a través de Hot Chocolate)
- OData
Nota: Estas integraciones se basan en pruebas limitadas y no cuentan con soporte oficial (todavía). Su kilometraje puede variar, pero hasta ahora, son muy prometedoras.
Identidad ASP.NET Core
Microsoft.AspNetCore.Identity.EntityFrameworkCore proporciona un sistema plug-and-play de autenticación y gestión de usuarios para aplicaciones ASP.NET.
El proveedor EF Core de Couchbase funciona bien con él. La única advertencia es que tendrás que asegurarte de que el archivo primero existen las colecciones adecuadas (como AspNetUsers, AspNetRoles, etc.).
Nota: Debe crear previamente las siguientes colecciones: AspNetUsers, AspNetRoles, AspNetUserRoles, AspNetUserClaims, AspNetUserLogins, AspNetUserTokens, AspNetRoleClaims.
Ejemplo de configuración 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 { } |
MVC auth ejemplo
Este es un controlador ASP.NET Core MVC con registro, inicio de sesión y cierre de sesión, así como un rol personalizado:
|
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"); } } |
Los datos siguen la estructura estándar de Identity, almacenados en un documento Couchbase. Por ejemplo, un documento en AspNetUser colección:

GraphQL con chocolate caliente
Chocolate caliente es un popular servidor GraphQL para .NET. Puede integrarse con EF Core, apoyándose en las capacidades LINQ del proveedor (que tiene Couchbase). Esto significa que las consultas GraphQL se traducen a LINQ, que a su vez se traduce a Couchbase SQL++.
Configurar
|
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(); |
Ejemplo de uso
- Ir a /graphql en el navegador (se abre una interfaz web)
- Prueba con una consulta como ésta:
|
1 2 3 4 5 6 7 8 9 |
query { widgets(where: { name: { contains: "foo" } }, order: { createdDt: DESC }) { id name price numInStock createdDt } } |
Esto devolverá 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" } ] } } |
Consejos
-
- Las consultas GraphQL tienen que coincidir con sus índices GSI (no son más que consultas SQL++ bajo el capó).
- Puede utilizar índices de cubiertas y otros índices SQL++ para mejorar el rendimiento.
OData
Microsoft.AspNetCore.OData expone tus datos de EF Core como puntos finales OData, facilitando la conexión de herramientas como Excel, Power BI y Tableau a Couchbase.
Programa de ejemplo.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; |
Ejemplo de consultas OData
-
- https://localhost:7037/odata/Widgets?$filter=price gt 1&$orderby=nombre
- https://localhost:7037/odata/Widgets?$select=name,price&$top=10

Nota: Asegúrate de que tus consultas EF Core LINQ se pueden traducir a SQL++ y que cualquier campo filtrado/clasificado está indexado en Couchbase.
Conclusión
Todas estas integraciones están respaldadas por EF Core y ahora, con el soporte de Couchbase, puedes aprovecharlas al máximo en tu código. Tanto si estás creando aplicaciones web seguras, APIs GraphQL o integrándote con herramientas de BI, el combo EF Core y Couchbase lo hace posible.
¿Quiere ver más? Díganos qué integraciones le gustaría explorar a continuación.
-
- Discordia
- Foros de Couchbase .NET
- Documentación de Couchbase EF Core
- Echa un vistazo a este breve vídeo para conocer las integraciones de EF Core que se tratan en este artículo.
- También puedes ver el Standup de la Comunidad .NET en el que se presenta el proveedor Couchbase EF Core y sus capacidades.