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 maneja solicitudes HTTP, enrutamiento e 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, puede usar los patrones familiares de EF junto con el modelo de documento flexible de MongoDB y las capacidades de consulta de OData. Esta combinación es compatible con aplicaciones que requieren interfaces de consulta complejas, seguridad de tipos y diseño de API basado en estándares. Puede usar MongoDB, ASP.NET Core y OData para crear aplicaciones prácticas, como paneles de análisis de datos, sistemas de informes 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 prerrequisitos.
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.
Agregue las dependencias requeridas.
En su directorio RestaurantODataApi, ejecute los siguientes comandos para agregar los paquetes NuGet necesarios:
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 el directorio RestaurantODataApi, cree un subdirectorio Controllers. Añada un archivo llamado RestaurantsController.cs al subdirectorio y pegue 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$filter: Devolver datos según criterios de filtro$orderby: Ordena los resultados por un campo especificado$expand: Incluya datos relacionados en los resultados$count: Incluir un conteo de los resultados$top:Establezca 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.
Inicie 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 independiente, ejecute los siguientes comandos curl para probar los puntos de conexión de OData. Cada punto de conexión devuelve datos JSON en formato OData que incluyen información de restaurantes de la colección sample_restaurants.restaurants. Si la ejecución es correcta, los comandos curl devuelven datos similares a los resultados de ejemplo 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"} ]} Filtrar 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 múltiples campos.
El siguiente comando utiliza operadores de consulta OData para recuperar documentos que tienen un valor
boroughde"Queens"y un valornameque 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"} ]}
¡Felicitaciones por completar el tutorial de inicio rápido de EF, ASP.NET y OData! Tras completar estos pasos, dispondrá de una API REST de OData de ASP.NET Core que se conecta a su implementación de MongoDB, devuelve datos de restaurantes mediante puntos de conexión de OData y admite funciones avanzadas de consulta como filtrado, ordenación, 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 deOData de ASP.NET Core
Documentación del Protocolo OData
Documentación delproveedor principal de MongoDB Entity Framework