Overview
En esta guía, aprenderá a crear una aplicación ASP.NET Core que ofrece puntos de conexión 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 crear y consumir API RESTful, que permite interactuar con datos mediante solicitudes HTTP.
La aplicación de 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 datos: el proveedor principal de EF 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 OData de ASP.NET Core con Entity Framework (EF) Core Provider para MongoDB para crear API REST consultables. OData proporciona una forma uniforme de exponer e interactuar con datos y ofrece funciones avanzadas de consulta, como filtrado, ordenación, 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 muestra cómo crear una API REST de OData que utiliza MongoDB, ASP.NET Core y el proveedor de EF Core. La aplicación accede a datos de muestra de restaurantes, expone puntos de conexión compatibles con OData y admite funciones avanzadas de consulta, como filtrado, ordenación, paginación y selección de campos. El tutorial también incluye instrucciones para conectarse a un clúster de MongoDB alojado en MongoDB Atlas.
Tip
Si prefiere conectarse a MongoDB mediante el proveedor EF Core sin ASP.NET Core, consulte la Tutorialde inicio rápido del proveedor de Entity Framework.
Configurar el proyecto
Siga los pasos de esta sección para instalar las dependencias del proyecto, crear un clúster Atlas y configurar la estructura de la aplicación.
Verificar los prerrequisitos.
Para crear la aplicación de inicio rápido, instale el siguiente software en su entorno de desarrollo:
Requisito previo | notas |
|---|---|
Instalar .NET 8.0 o posterior. | |
Editor de código | Utilice el editor de código de su elección. |
Aplicación de terminal y shell | Para usuarios de Windows, use PowerShell o el Símbolo del sistema. Para usuarios de macOS/Linux, use Terminal o una aplicación similar. |
Crear un clúster de MongoDB Atlas.
MongoDB Atlas es un servicio de base de datos en la nube totalmente administrado que aloja sus implementaciones de MongoDB. Si no tiene una implementación de MongoDB, puede crear un clúster de MongoDB gratis completando el tutorial de introducción a MongoDB. Este tutorial también muestra cómo cargar conjuntos de datos de muestra en su clúster, incluyendo... sample_restaurants base de datos que se utiliza en este tutorial.
Para conectarse a su clúster de MongoDB, debe usar una cadena de conexión. Para saber cómo recuperarla, consulte la sección "Agregar su cadena de conexión" del tutorial "Introducción a MongoDB".
Importante
Guarde su 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.EntityFrameworkCore:El proveedor principal de MongoDB EFMicrosoft.AspNetCore.OData:Compatibilidad de OData con ASP.NET Core
Configure su conexión a la 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" } }
Reemplace el marcador de posición <connection string> con la cadena de conexión que guardó en el tutorial Introducción a MongoDB.
Crea tu aplicación
Después de configurar la estructura y las dependencias del proyecto, siga los pasos de esta sección para crear sus modelos de datos, DbContext y puntos finales de OData.
Crear los modelos de datos.
En el directorio RestaurantODataApi, cree 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 de modelo define la estructura de los datos del restaurante de la colección sample_restaurants.restaurants de MongoDB e incluye los atributos de serialización de Entity Framework y MongoDB.
Configure su conexión a la base de datos.
En su directorio RestaurantODataApi, cree un archivo llamado RestaurantDbContext.cs y agregue 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 los modelos y la base de datos subyacente. El código configura EF para funcionar con MongoDB y asigna la Restaurant entidad a la sample_restaurants.restaurants colección.
Cree 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 puntos finales REST de OData:
GET /odata/Restaurants: Recupera todos los documentos de la colecciónrestaurants. El atributoEnableQueryy sus opciones de configuración permiten usar parámetros de consulta OData, como$filtery$orderby, en las solicitudes HTTP.GET /odata/GetRestaurantsByBorough(borough='{borough}'):Recupera documentos que tienen el valorboroughespecificado.GET /odata/GetRestaurantsByCuisine(cuisine='{cuisine}'):Recupera documentos que tienen el valorcuisineespecificado.
Definir la lógica de la aplicación.
Navegue hasta el archivo Program.cs y reemplace 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 de MongoDB, Entity Framework DbContext y los servicios OData. El código de configuración de OData habilita los siguientes parámetros de consulta, que puede usar en sus puntos finales HTTP:
$select: Devuelve los campos especificados en los resultados$filter: Devolver datos según criterios de filtro$orderby:Ordenar los resultados por un campo específico$expand:Incluir datos relacionados en los resultados$count:Incluir un recuento de los resultados$top:Establezca el número máximo de resultados, limitado a100
Ejecute su aplicación
Por último, siga los pasos de esta sección para ejecutar su API REST de OData y probar los puntos finales 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, el resultado 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.
Pruebe sus puntos finales de 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 los restaurantes que tienen un valor
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"} ]} Filtrar restaurantes por tipo de cocina.
El siguiente comando recupera los restaurantes que tienen un valor
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"} ]}
Pruebe las capacidades de consulta avanzadas de OData.
Puede usar los puntos finales para ejecutar consultas complejas incluyendo parámetros y operadores de consulta de OData. Los siguientes comandos curl prueban estas funciones.
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 obtener más información sobre los conceptos mencionados en este tutorial, consulte los siguientes recursos:
Documentación deOData de ASP.NET Core
Documentación delprotocolo OData
Documentación delproveedor principal de MongoDB Entity Framework
Documentación delcontrolador C# de MongoDB