Docs Menu
Docs Home
/ /

Integrar MongoDB con Entity Framework y ASP.NET Core

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.

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.

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.

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.

1

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.

2

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.

3

Desde su terminal, ejecute 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.EntityFrameworkCore:El proveedor principal de MongoDB EF

  • Microsoft.AspNetCore.OData:Compatibilidad de OData con 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"
}
}

Reemplace el marcador de posición <connection string> con la cadena de conexión que guardó en el tutorial Introducción a MongoDB.

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.

1

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:

RestaurantODataApi/Modelos/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 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.

2

En su directorio RestaurantODataApi, cree un archivo llamado RestaurantDbContext.cs y agregue 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 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.

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/Controladores/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 puntos finales REST de OData:

  • GET /odata/Restaurants: Recupera todos los documentos de la colección restaurants. El atributo EnableQuery y sus opciones de configuración permiten usar parámetros de consulta OData, como $filter y $orderby, en las solicitudes HTTP.

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

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

4

Navegue hasta el archivo Program.cs y reemplace su contenido con el siguiente código:

RestauranteODataApi/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 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 a 100

Por último, siga los pasos de esta sección para ejecutar su API REST de OData y probar los puntos finales mediante solicitudes HTTP.

1

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.
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 los restaurantes que tienen un valor 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. Filtrar restaurantes por tipo de cocina.

    El siguiente comando recupera los restaurantes que tienen un valor 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 puntos finales para ejecutar consultas complejas incluyendo parámetros y operadores de consulta de OData. Los siguientes comandos curl prueban estas funciones.

  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 obtener más información sobre los conceptos mencionados en este tutorial, consulte los siguientes recursos:

Volver

Compatibilidad

En esta página