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 |
público clase AppDbContext : IdentityDbContext<AplicaciónUsuario> { público AppDbContext(DbContextOptions<AppDbContext> opciones) : base(opciones) { } protegido anular void OnModelCreating(ModelBuilder constructor) { base.OnModelCreating(constructor); constructor.Entidad<AplicaciónUsuario>().ToCouchbaseCollection(este, "AspNetUsers"); constructor.Entidad<IdentidadRole>().ToCouchbaseCollection(este, "AspNetRoles"); constructor.Entidad<IdentidadUserRole<cadena>>().ToCouchbaseCollection(este, "AspNetUserRoles"); constructor.Entidad<IdentityUserClaim<cadena>>().ToCouchbaseCollection(este, "AspNetUserClaims"); constructor.Entidad<IdentidadUserLogin<cadena>>().ToCouchbaseCollection(este, "AspNetUserLogins"); constructor.Entidad<IdentityUserToken<cadena>>().ToCouchbaseCollection(este, "AspNetUserTokens"); constructor.Entidad<IdentityRoleClaim<cadena>>().ToCouchbaseCollection(este, "AspNetRoleClaims"); } } público clase AplicaciónUsuario : IdentidadUsuario { } |
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 |
público clase AuthController : Controlador { privado sólo lectura Gestor de usuarios<AplicaciónUsuario> _userManager; privado sólo lectura SignInManager<AplicaciónUsuario> _signInManager; privado sólo lectura Gestor de roles<IdentidadRole> _roleManager; público AuthController(Gestor de usuarios<AplicaciónUsuario> userManager, SignInManager<AplicaciónUsuario> signInManager, Gestor de roles<IdentidadRole> gestor de funciones) { _userManager = userManager; _signInManager = signInManager; _roleManager = gestor de funciones; } público IActionResult Regístrese en() => Ver(); [HttpPost] público async Tarea<IActionResult> Regístrese en(RegisterModel modelo) { si (!EstadoModelo.IsValid) devolver Ver(modelo); var usuario = nuevo AplicaciónUsuario { Nombre de usuario = modelo.Correo electrónico, Correo electrónico = modelo.Correo electrónico }; var resultado = await _userManager.CreateAsync(usuario, modelo.Contraseña); si (resultado.Con éxito) { var roleName = "CustomRole"; si (!await _roleManager.RoleExistsAsync(roleName)) await _roleManager.CreateAsync(nuevo IdentidadRole(roleName)); await _userManager.AddToRoleAsync(usuario, roleName); await _signInManager.SignInAsync(usuario, isPersistent: falso); devolver RedirectToAction("Índice", "Inicio"); } foreach (var error en resultado.Errores) EstadoModelo.AddModelError("", error.Descripción); devolver Ver(modelo); } público IActionResult Inicio de sesión() => Ver(); [HttpPost] público async Tarea<IActionResult> Inicio de sesión(LoginModel modelo) { si (!EstadoModelo.IsValid) devolver Ver(modelo); var resultado = await _signInManager.PasswordSignInAsync(modelo.Correo electrónico, modelo.Contraseña, falso, falso); si (resultado.Con éxito) devolver RedirectToAction("Índice", "Inicio"); EstadoModelo.AddModelError("", "Intento de inicio de sesión no válido".); devolver Ver(modelo); } público async Tarea<IActionResult> Cierre de sesión() { await _signInManager.SignOutAsync(); devolver RedirectToAction("Índice", "Inicio"); } } |
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 |
público clase WidgetQuery { [UtilizarFiltrado] [UtilizarClasificación] público IQueryable<Widget> GetWidgets([Servicio] WidgetDbContext dbContext) => dbContext.Widgets; } // Programa.cs: constructor.Servicios .AddGraphQLServer() .AddQueryType<WidgetQuery>() .Añadir filtro() .AñadirClasificación() .AñadirProyecciones(); aplicación.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 |
consulta { widgets(donde: { nombre: { contiene: "foo" } }, pedir: { creadoDt: DESC }) { id nombre precio numInStock creadoDt } } |
Esto devolverá resultados como:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "datos": { "widgets": [ { "id": "b5c494fe-135f-4f01-bf12-6e4ad1eee829", "nombre": "foobar", "precio": 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 |
constructor.Servicios.AddControllersWithViews() .AñadirDatos(op => { var odataBuilder = nuevo ODataConventionModelBuilder(); odataBuilder.Conjunto de entidades<Widget>("Widgets"); op.AddRouteComponents("odata", odataBuilder.GetEdmModel()) .Filtro() .OrderBy() .Seleccione() .Ampliar() .Cuenta() .SetMaxTop(100); }); |
Controlador
1 2 3 |
[HttpGet("/odata/Widgets")] [EnableQuery] público IQueryable<Widget> GetOData() => _contexto.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.