Overview
En esta guía, puedes aprender cómo crear una aplicación ASP.NET Core que ofrece puntos finales OData y utiliza el Proveedor de Entity Framework (EF) Core para acceder a MongoDB. ASP.NET Core es un framework multiplataforma para crear aplicaciones en la nube. OData es un protocolo estandarizado para construir y consumir API RESTful, y te permite interactuar con los datos utilizando solicitudes HTTP.
La aplicación en este tutorial consta de las siguientes capas:
Capa de base de datos: MongoDB proporciona almacenamiento y recuperación de datos.
Capa de aplicación: ASP.NET Core gestiona las solicitudes HTTP, el enrutamiento y la inyección de dependencias.
Capa de acceso a los datos: El Proveedor EF Core proporciona mapeo de documentos MongoDB y traducción de consultas OData.
¿Por qué utilizar MongoDB con ASP.NET Core y OData?
Este tutorial utiliza el framework ASP.NET Core OData con el proveedor Core de Entity Framework (EF) para MongoDB para crear API REST que se pueden consultar. OData proporciona una forma uniforme de exponer e interactuar con los datos y ofrece capacidades avanzadas de consulta, como filtrado, ordenado, paginación y selección de campos.
Al integrar MongoDB con ASP.NET Core y OData, puedes utilizar los patrones familiares de EF junto con el modelo orientado a documentos flexible de MongoDB y las capacidades de query de OData. Esta combinación respalda las aplicaciones que requieren interfaces de query complejas, seguridad de tipos y un diseño de API basado en normas. Puedes usar MongoDB, ASP.NET Core y OData para crear aplicaciones del mundo real, como tableros de análisis de datos, sistemas de reportes o cualquier aplicación que requiera consultas de datos complejas.
Tutorial de inicio rápido
Este tutorial te muestra cómo compilar una API REST OData que utiliza MongoDB, ASP.NET Core y el EF Core proveedor. La aplicación accede a datos de ejemplo de restaurantes, expone puntos finales compatibles con OData y admite capacidades avanzadas de consulta como filtrado, clasificación, paginación y selección de campos. El tutorial también incluye instrucciones para conectar a un clúster MongoDB alojado en MongoDB Atlas.
Tip
Si prefieres conectarte a MongoDB usando el Proveedor EF Core sin ASP.NET Core, consulta el Tutorial Guía rápida del proveedor de Entity Framework.
Configurar el proyecto
Sigue los pasos de esta sección para instalar las dependencias del proyecto, crear un clúster de Atlas y configurar la estructura de la aplicación.
Verificar los requisitos previos.
Para crear la aplicación Quick Start, instala el siguiente software en tu entorno de desarrollo:
Requisito previo | notas |
|---|---|
Instalar .NET 8.0 o posterior. | |
Editor de código | Usa el editor de código de tu preferencia. |
Aplicación de terminal y shell | Para usuarios de Windows, utilizad PowerShell o el Símbolo del sistema. Para usuarios de macOS/Linux, utiliza Terminal o una aplicación similar. |
Crea un clúster de MongoDB Atlas.
MongoDB Atlas es un servicio de base de datos en la nube completamente gestionado que aloja tus implementaciones de MongoDB. Si no tienes una implementación de MongoDB, puedes crear un clúster de MongoDB de forma gratuita al completar el Tutorial de Introducción a MongoDB. El tutorial Get Started de MongoDB también demuestra cómo cargar conjuntos de datos de muestra en tu clúster, incluido el sample_restaurants base de datos que se emplea en este tutorial.
Para conectarte a tu clúster de MongoDB, debes usar una cadena de conexión. Para aprender cómo recuperar tu cadena de conexión, consulta la sección Agregar tu cadena de conexión del tutorial de introducción de MongoDB.
Importante
Guarda tu cadena de conexión en una ubicación segura.
Agregar las dependencias necesarias.
En tu directorio RestaurantODataApi, ejecuta los siguientes comandos para añadir los paquetes de NuGet requeridos:
dotnet add package MongoDB.EntityFrameworkCore dotnet add package Microsoft.AspNetCore.OData
Estos comandos instalan los siguientes paquetes:
MongoDB.EntityFrameworkCoreEl proveedor MongoDB EF CoreMicrosoft.AspNetCore.OData: Soporte OData para ASP.NET Core
Configurar la conexión de tu base de datos.
Navegue hasta el archivo appsettings.json en su proyecto RestaurantODataApi y pegue el siguiente código:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "MongoDB": { "ConnectionString": "<connection string>", "DatabaseName": "sample_restaurants" } }
Reemplaza el marcador de posición <connection string> con la cadena de conexión que guardaste del tutorial de introducción a MongoDB.
Cree su aplicación
Después de configurar la estructura del proyecto y las dependencias, sigue los pasos en esta sección para crear tus modelos de datos, DbContext y los puntos finales de OData.
Crear los modelos de datos.
En tu directorio RestaurantODataApi, crea un subdirectorio Models. Luego, cree un archivo llamado Restaurant.cs en el directorio Models y agregue el siguiente código:
using Microsoft.EntityFrameworkCore; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using System.ComponentModel.DataAnnotations; namespace RestaurantODataApi.Models { public class Restaurant { [] [] [] public string Id { get; set; } = string.Empty; [] public string? Name { get; set; } [] public string? Cuisine { get; set; } [] public string? Borough { get; set; } } }
Esta clase modelo define la estructura de los datos del restaurante a partir de la colección MongoDB sample_restaurants.restaurants e incluye el Entity Framework y los atributos de serialización de MongoDB.
Configurar la conexión de tu base de datos.
En tu directorio RestaurantODataApi, crea un archivo llamado RestaurantDbContext.cs y añade el siguiente código:
using Microsoft.EntityFrameworkCore; using MongoDB.Driver; using MongoDB.EntityFrameworkCore.Extensions; using RestaurantODataApi.Models; namespace RestaurantODataApi { public class RestaurantDbContext : DbContext { public DbSet<Restaurant> Restaurants { get; set; } public RestaurantDbContext(DbContextOptions<RestaurantDbContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // Configures the Restaurant entity to map to the "restaurants" collection modelBuilder.Entity<Restaurant>().ToCollection("restaurants"); } } }
Esta clase deriva de DBContext, que configura la relación entre tus modelos y la base de datos subyacente. El código configura EF para trabajar con MongoDB y asigna la entidad Restaurant a la colección sample_restaurants.restaurants.
Crea el controlador OData.
En su directorio RestaurantODataApi, cree un subdirectorio Controllers. Luego, añade un archivo llamado RestaurantsController.cs al subdirectorio y pega el siguiente código:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.OData.Query; using Microsoft.AspNetCore.OData.Routing.Controllers; using Microsoft.AspNetCore.OData.Routing.Attributes; using RestaurantODataApi.Models; namespace RestaurantODataApi.Controllers { public class RestaurantsController : ODataController { private readonly RestaurantDbContext _context; public RestaurantsController(RestaurantDbContext context) { _context = context; } [] public IQueryable<Restaurant> Get() { return _context.Restaurants; } [] [] public IQueryable<Restaurant> GetRestaurantsByBorough(string borough) { return _context.Restaurants.Where(r => r.Borough == borough); } [] [] public IQueryable<Restaurant> GetRestaurantsByCuisine(string cuisine) { return _context.Restaurants.Where(r => r.Cuisine == cuisine); } } }
Este controlador define los siguientes endpoints REST de OData:
GET /odata/Restaurants: Recupera todos los documentos de la colecciónrestaurants. El atributoEnableQueryy sus opciones de configuración le permiten utilizar parámetros de query OData, como$filtery$orderby, en sus solicitudes HTTP.GET /odata/GetRestaurantsByBorough(borough='{borough}'): Recupera documentos que tienen el valor deboroughespecificado.GET /odata/GetRestaurantsByCuisine(cuisine='{cuisine}'): Recupera documentos que tienen el valor decuisineespecificado.
Definir la lógica de la aplicación.
Navega al archivo Program.cs y reemplaza su contenido con el siguiente código:
using Microsoft.AspNetCore.OData; using Microsoft.EntityFrameworkCore; using Microsoft.OData.ModelBuilder; using MongoDB.Driver; using RestaurantODataApi; using RestaurantODataApi.Models; var builder = WebApplication.CreateBuilder(args); // Configures the MongoDB connection var connectionString = builder.Configuration["MongoDB:ConnectionString"]; var databaseName = builder.Configuration["MongoDB:DatabaseName"] ?? "sample_restaurants"; if (string.IsNullOrEmpty(connectionString)) { throw new InvalidOperationException("MongoDB connection string is required. Please set MongoDB:ConnectionString in appsettings.json"); } // Registers a MongoDB client builder.Services.AddSingleton<IMongoClient>(sp => new MongoClient(connectionString)); // Registers the DbContext builder.Services.AddDbContext<RestaurantDbContext>(options => { var mongoClient = new MongoClient(connectionString); options.UseMongoDB(mongoClient, databaseName); }); // Configures the OData EDM model var modelBuilder = new ODataConventionModelBuilder(); modelBuilder.EntitySet<Restaurant>("Restaurants"); modelBuilder.EntityType<Restaurant>().HasKey(r => r.Id); // Registers the unbound functions var getRestaurantsByBoroughFunction = modelBuilder.Function("GetRestaurantsByBorough"); getRestaurantsByBoroughFunction.Parameter<string>("borough"); getRestaurantsByBoroughFunction.ReturnsCollectionFromEntitySet<Restaurant>("Restaurants"); var getRestaurantsByCuisineFunction = modelBuilder.Function("GetRestaurantsByCuisine"); getRestaurantsByCuisineFunction.Parameter<string>("cuisine"); getRestaurantsByCuisineFunction.ReturnsCollectionFromEntitySet<Restaurant>("Restaurants"); // Configures OData with ASP.NET Core builder.Services.AddControllers() .AddOData(opt => opt .AddRouteComponents("odata", modelBuilder.GetEdmModel()) .Select() .Filter() .OrderBy() .Expand() .Count() .SetMaxTop(100)); var app = builder.Build(); app.UseRouting(); app.MapControllers(); app.Run();
Este código configura la conexión a MongoDB, Entity Framework DbContext y los servicios de OData. El código de configuración de OData permite los siguientes parámetros de query, que puedes utilizar en tus endpoints HTTP:
$selectDevuelve los campos especificados en los resultados$filterDatos de retorno según los criterios del filtro$orderby: Ordena los resultados por un campo especificado$expand: Incluya datos relacionados en los resultados$count: Incluir un conteo de los resultados$top: Establecer el número máximo de resultados, limitado a100
Ejecutar la aplicación
Finalmente, sigue los pasos de esta sección para ejecutar tu API REST de OData y probar los endpoints mediante solicitudes HTTP.
Inicia la aplicación ASP.NET Core.
Desde su directorio RestaurantODataApi, ejecute el siguiente comando para compilar e iniciar la aplicación:
dotnet run
Si tiene éxito, la salida del comando se parecerá al siguiente ejemplo:
info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:5236 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down.
Prueba tus endpoints OData.
En una terminal separada, ejecuta los siguientes comandos curl para probar los endpoints OData. Cada endpoint devuelve datos JSON en formato OData que incluyen información de restaurantes de la colección sample_restaurants.restaurants. Si es exitoso, sus curl comandos devolverán datos similares a los resultados de muestra proporcionados. Los comandos también limitan los resultados a 5 documentos.
Recuperar todos los restaurantes.
curl 'http://localhost:5236/odata/Restaurants?$top=5' {"@odata.context":"http://localhost:5236/odata/$metadata#Restaurants", "value":[ {"Id":"...","Name":"Riviera Caterer","Cuisine": "American","Borough":"Brooklyn","RestaurantId":"40356018"}, {"Id":"...","Name":"Wilken'S Fine Food","Cuisine": "Delicatessen","Borough":"Brooklyn","RestaurantId":"40356483"}, {"Id":"...","Name":"Kosher Island","Cuisine": "Jewish/Kosher","Borough":"Staten Island","RestaurantId":"40356442"}, {"Id":"...","Name":"Wendy'S","Cuisine":"Hamburgers", "Borough":"Brooklyn","RestaurantId":"30112340"}, {"Id":"...","Name":"Morris Park Bake Shop","Cuisine": "Bakery","Borough":"Bronx","RestaurantId":"30075445"} ]} Filtra restaurantes por distrito.
El siguiente comando recupera restaurantes que tienen un valor de
boroughde"Queens":curl 'http://localhost:5236/odata/GetRestaurantsByBorough(borough=%27Queens%27)?$top=5' {"@odata.context":"http://localhost:5236/odata/$metadata#Restaurants", "value":[ {"Id":"...","Name":"Tov Kosher Kitchen","Cuisine":"Jewish/Kosher", "Borough":"Queens","RestaurantId":"40356068"}, {"Id":"...","Name":"Brunos On The Boulevard","Cuisine":"American", "Borough":"Queens","RestaurantId":"40356151"}, {"Id":"...","Name":"Carvel Ice Cream","Cuisine":"Ice Cream, Gelato, Yogurt, Ices", "Borough":"Queens","RestaurantId":"40361322"}, {"Id":"...","Name":"Sal'S Deli","Cuisine":"Delicatessen", "Borough":"Queens","RestaurantId":"40361618"}, {"Id":"...","Name":"Steve Chu'S Deli & Grocery","Cuisine":"Delicatessen", "Borough":"Queens","RestaurantId":"40361998"} ]} Filtra restaurantes por tipo de cocina.
El siguiente comando recupera restaurantes que tienen un valor de
cuisinede"Mexican":curl 'http://localhost:5236/odata/GetRestaurantsByCuisine(cuisine=%27Mexican%27)?$top=5' {"@odata.context":"http://localhost:5236/odata/$metadata#Restaurants", "value":[ {"Id":"...","Name":"Panchito'S","Cuisine":"Mexican","Borough":"Manhattan"}, {"Id":"...","Name":"Mexico Lindo Restaurant","Cuisine":"Mexican","Borough":"Manhattan"}, {"Id":"...","Name":"Casa Pepe","Cuisine":"Mexican","Borough":"Brooklyn"}, {"Id":"...","Name":"Cuchifrito","Cuisine":"Mexican","Borough":"Manhattan"}, {"Id":"...","Name":"Mary Ann'S","Cuisine":"Mexican","Borough":"Manhattan"} ]}
Prueba las capacidades avanzadas de query de OData.
Puede usar los endpoints para ejecutar queries complejas incluyendo parámetros de query OData y operadores. Los siguientes comandos curl prueban estas capacidades.
Filtrar por varios campos.
El siguiente comando utiliza operadores del query OData para recuperar documentos que tienen un valor de
boroughde"Queens"y un valor denameque contiene"Moon":curl 'http://localhost:5236/odata/Restaurants?$filter=Borough%20eq%20%27Queens%27%20and%20contains(Name,%20%27Moon%27)' {"@odata.context":"http://localhost:5236/odata/$metadata#Restaurants", "value":[ {"Id":"...","Name":"New Moon Star Restaurant","Cuisine":"Chinese","Borough":"Queens"}, {"Id":"...","Name":"Moon Tikka Grill","Cuisine":"Indian","Borough":"Queens"}, {"Id":"...","Name":"Silver Moon Diner","Cuisine":"American","Borough":"Queens"}, {"Id":"...","Name":"Mooney'S Public House","Cuisine":"Irish","Borough":"Queens"}, {"Id":"...","Name":"Moon Light Crill Rest","Cuisine":"Indian","Borough":"Queens"}, {"Id":"...","Name":"Full Moon Cafe","Cuisine":"Café/Coffee/Tea","Borough":"Queens"}, {"Id":"...","Name":"Pacific Moon","Cuisine":"Chinese","Borough":"Queens"}, {"Id":"...","Name":"Moon Palace Kitchen","Cuisine":"Chinese","Borough":"Queens"}, {"Id":"...","Name":"Honey Moon Coffee Shop","Cuisine":"Café/Coffee/Tea","Borough":"Queens"}, {"Id":"...","Name":"Honey Moon Coffee Shop","Cuisine":"Café/Coffee/Tea","Borough":"Queens"} ]}% Ordena y cuenta tus resultados.
El siguiente comando ordena los documentos que coinciden con el filtro
cuisinepor su valornamey cuenta el número total de documentos coincidentes:curl 'http://localhost:5236/odata/GetRestaurantsByCuisine(cuisine=%27Czech%27)?$orderby=Name&$count=true' {"@odata.context":"http://localhost:5236/odata/$metadata#Restaurants", "@odata.count":6, "value":[ {"Id":"...","Name":"Bohemian Beer Garden","Cuisine":"Czech","Borough":"Queens"}, {"Id":"...","Name":"Brooklyn Beet Company","Cuisine":"Czech","Borough":"Brooklyn"}, {"Id":"...","Name":"Hospoda","Cuisine":"Czech","Borough":"Manhattan"}, {"Id":"...","Name":"Koliba Restaurant","Cuisine":"Czech","Borough":"Queens"}, {"Id":"...","Name":"Milan'S Restaurant","Cuisine":"Czech","Borough":"Brooklyn"}, {"Id":"...","Name":"Olde Prague Tavern","Cuisine":"Czech","Borough":"Queens"} ]}
¡Felicidades por completar el tutorial de inicio rápido de EF, ASP.NET y OData! Una vez completes estos pasos, tendrás un REST API OData de ASP.NET Core que se conecta a tu implementación de MongoDB, devuelve datos de restaurantes usando endpoints OData y admite capacidades avanzadas de consulta como filtrado, ordenamiento, paginación, selección de campos y búsqueda.
Recursos adicionales
Para aprender más sobre los conceptos mencionados en este tutorial, consulta los siguientes recursos:
documentación de ASP.NET Core OData
Documentación del Protocolo OData
Proveedor de MongoDB Entity Framework Core Documentación