Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Integra MongoDB con Entity Framework y ASP.NET Core

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.

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.

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.

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.

1

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.

2

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.

3

Desde tu terminal, ejecuta los siguientes comandos para crear un nuevo proyecto de API Web ASP.NET Core llamado RestaurantODataApi:

dotnet new webapi -n RestaurantODataApi
cd RestaurantODataApi
4

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 Core

  • Microsoft.AspNetCore.OData: Soporte OData para ASP.NET Core

5

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.

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.

1

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:

RestaurantODataApi/Models/Restaurant.cs
using Microsoft.EntityFrameworkCore;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using System.ComponentModel.DataAnnotations;
namespace RestaurantODataApi.Models
{
public class Restaurant
{
[Key]
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; } = string.Empty;
[BsonElement("name")]
public string? Name { get; set; }
[BsonElement("cuisine")]
public string? Cuisine { get; set; }
[BsonElement("borough")]
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.

2

En tu directorio RestaurantODataApi, crea un archivo llamado RestaurantDbContext.cs y añade el siguiente código:

RestaurantODataApi/RestaurantDbContext.cs
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.

3

En el directorio RestaurantODataApi, cree un subdirectorio Controllers. Añada un archivo llamado RestaurantsController.cs al subdirectorio y pegue el siguiente código:

RestaurantODataApi/Controllers/RestaurantsController.cs
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;
}
[EnableQuery(PageSize = 50, AllowedQueryOptions = AllowedQueryOptions.All)]
public IQueryable<Restaurant> Get()
{
return _context.Restaurants;
}
[HttpGet("odata/GetRestaurantsByBorough(borough={borough})")]
[EnableQuery(PageSize = 20)]
public IQueryable<Restaurant> GetRestaurantsByBorough(string borough)
{
return _context.Restaurants.Where(r => r.Borough == borough);
}
[HttpGet("odata/GetRestaurantsByCuisine(cuisine={cuisine})")]
[EnableQuery(PageSize = 20)]
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ón restaurants. El atributo EnableQuery y sus opciones de configuración le permiten utilizar parámetros de query OData, como $filter y $orderby, en sus solicitudes HTTP.

  • GET /odata/GetRestaurantsByBorough(borough='{borough}'): Recupera documentos que tienen el valor de borough especificado.

  • GET /odata/GetRestaurantsByCuisine(cuisine='{cuisine}'): Recupera documentos que tienen el valor de cuisine especificado.

4

Navega al archivo Program.cs y reemplaza su contenido con el siguiente código:

RestaurantODataApi/Program.cs
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 a 100

Finalmente, sigue los pasos de esta sección para ejecutar tu API REST de OData y probar los endpoints mediante solicitudes HTTP.

1

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.
2

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.

  1. 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"}
    ]}
  2. Filtrar restaurantes por distrito.

    El siguiente comando recupera restaurantes que tienen un valor de borough de "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"}
    ]}
  3. Filtra restaurantes por tipo de cocina.

    El siguiente comando recupera restaurantes que tienen un valor de cuisine de "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"}
    ]}
3

Puede usar los endpoints para ejecutar queries complejas incluyendo parámetros de query OData y operadores. Los siguientes comandos curl prueban estas capacidades.

  1. Filtrar por múltiples campos.

    El siguiente comando utiliza operadores de consulta OData para recuperar documentos que tienen un valor borough de "Queens" y un valor name que 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"}
    ]}%
  2. Ordena y cuenta tus resultados.

    El siguiente comando ordena los documentos que coinciden con el filtro cuisine por su valor name y 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.

Para aprender más sobre los conceptos mencionados en este tutorial, consulta los siguientes recursos:

Volver

Compatibilidad

En esta página