Visão geral
Neste guia, você pode aprender a criar um aplicação ASP .NET Core que oferece pontos de extremidade OData e usa o provedor Entity Framework (EF) Core Provider para acessar MongoDB. ASP .NET Core é uma estrutura de plataforma cruzada para criar aplicativos baseados em nuvem. OData é um protocolo padronizado para criar e consumir APIs RESTful e permite que você interaja com dados usando solicitações HTTP.
O aplicativo neste tutorial consiste nas seguintes camadas:
Camada de banco de dados: o MongoDB fornece armazenamento e recuperação de dados.
Camada de aplicativo: o ASP .NET Core lida com solicitações HTTP, roteamento e injeção de dependência.
Camada de acesso a dados: o provedor de núcleo da EF fornece mapeamento de documento MongoDB e tradução de query OData.
Por que usar o MongoDB com ASP .NET Core e OData?
Este tutorial usa a estrutura ASP .NET Core OData com o fornecedor Entity Framework (EF) Core para MongoDB para criar APIs REST consultáveis. O OData fornece uma maneira uniforme de expor e interagir com dados e fornece recursos avançados de query, como filtragem, classificação, paginação e seleção de campo .
Ao integrar o MongoDB com o ASP .NET Core e o OData, você pode usar os padrões conhecidos do EF junto com o modelo de documento flexível do MongoDB e os recursos de query do OData. Essa combinação oferece suporte a aplicativos que exigem interfaces de query complexas, segurança de tipos e design de API baseado em padrões. Você pode usar MongoDB, ASP .NET Core e OData para criar aplicativos do mundo real, como painéis de análise de dados, sistemas de relatórios ou qualquer aplicação que exija consulta de dados complexos.
Tutorial de início rápido
Este tutorial mostra como construir uma API OData REST que usa MongoDB, ASP .NET Core e o EF Core Provider. O aplicação acessa dados de exemplos de restaurantes, expõe endpoints compatíveis com OData e oferece suporte a recursos avançados de query, como filtragem, classificação, paginação e seleção de campo . O tutorial também inclui instruções para conectar-se a um cluster MongoDB hospedado no MongoDB Atlas.
Dica
Se você preferir se conectar ao MongoDB usando o provedor EF Core sem ASP .NET Core, consulte o tutorialde Início Rápido do Provedor Entity Framework.
Configurar seu projeto
Siga as etapas nesta seção para instalar as dependências do projeto, criar um cluster do Atlas e configurar a estrutura do aplicativo.
Verifique os pré-requisitos.
Para criar o aplicativo Quick Start, instale o seguinte software em seu ambiente de desenvolvimento:
Pré-requisitos | Notas |
|---|---|
Instale o .NET 8.0 ou posterior. | |
Editor de código | Use o editor de código de sua escolha. |
Aplicativo de terminal e shell | Para usuários do Windows, use o PowerShell ou Prompt de Comando. Para usuários do macOS/Linux, use o Terminal ou um aplicativo semelhante. |
Criar um cluster MongoDB Atlas .
O MongoDB Atlas é um serviço de banco de dados de nuvem totalmente gerenciado que hospeda suas implementações do MongoDB . Se você não tiver uma implementação do MongoDB , poderá criar um cluster do MongoDB gratuitamente concluindo o tutorial de Introdução ao MongoDB . O tutorial de Introdução ao MongoDB também demonstra como carregar conjuntos de dados de exemplo em seu cluster, incluindo o sample_restaurants banco de dados usado neste tutorial.
Para se conectar ao cluster MongoDB , você deve usar uma string de conexão. Para saber como recuperar sua string de conexão, consulte a seção Adicionar sua string de conexão do tutorial de Introdução ao MongoDB .
Importante
Salve sua string de conexão em um local seguro.
Adicione as dependências necessárias.
No seu diretório RestaurantODataApi, execute os seguintes comandos para adicionar os pacotes NuGet necessários:
dotnet add package MongoDB.EntityFrameworkCore dotnet add package Microsoft.AspNetCore.OData
Estes comandos instalam os seguintes pacotes:
MongoDB.EntityFrameworkCore: O fornecedor do MongoDB EF CoreMicrosoft.AspNetCore.OData: Suporte OData para ASP .NET Core
Configure sua conexão do banco de dados .
Navegue até o arquivo appsettings.json no seu projeto RestaurantODataApi e cole o seguinte código:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "MongoDB": { "ConnectionString": "<connection string>", "DatabaseName": "sample_restaurants" } }
Substitua o espaço reservado <connection string> pela string de conexão que você salvou do tutorial de Introdução ao MongoDB .
Crie seu aplicativo
Após configurar a estrutura e as dependências do projeto , siga as etapas nesta seção para criar seus modelos de dados, DbContext e endpoints OData.
Criar os modelos de dados.
No seu diretório RestaurantODataApi, crie um subdiretório Models. Em seguida, crie um arquivo denominado Restaurant.cs no diretório Models e adicione o seguinte 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 classe de modelo define a estrutura dos dados do restaurante da coleção sample_restaurants.restaurants do MongoDB e inclui os atributos de serialização Entity Framework e MongoDB .
Configure sua conexão do banco de dados .
No seu diretório RestaurantODataApi, crie um arquivo denominado RestaurantDbContext.cs e adicione o seguinte 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 classe deriva do DBContext, que configura o relacionamento entre seus modelos e o banco de dados subjacente. O código configura o EF para trabalhar com MongoDB e mapeia a Restaurant entidade para a sample_restaurants.restaurants coleção.
Crie o controlador OData.
No seu diretório RestaurantODataApi, crie um subdiretório Controllers. Em seguida, adicione um arquivo chamado RestaurantsController.cs ao subdiretório e cole o seguinte 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 os seguintes endpoints OData REST:
GET /odata/Restaurants: recupera todos os documentos na coleçãorestaurants. O atributoEnableQuerye suas opções de configuração permitem a você utilizar parâmetros de consulta OData, como$filtere$orderby, em suas solicitações HTTP.GET /odata/GetRestaurantsByBorough(borough='{borough}'): recupera documentos que tenham o valor deboroughespecificado.GET /odata/GetRestaurantsByCuisine(cuisine='{cuisine}'): recupera documentos que tenham o valor decuisineespecificado.
Defina a lógica do aplicação .
Navegue até o arquivo Program.cs e substitua seu conteúdo pelo seguinte 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 a conexão MongoDB , Entity Framework DbContext e serviços OData. O código de configuração OData habilita os seguintes parâmetros de query, que você pode usar em seus pontos de conexão HTTP:
$select: Retornar os campos especificados nos resultados$filter: retorna dados com base em critérios de filtro$orderby: Classificar os resultados por um campo especificado$expand: Incluir dados relacionados nos resultados$count: Inclua uma contagem dos resultados$top: Defina o número máximo de resultados, limitado a100
Execute seu aplicativo
Por fim, siga as etapas desta seção para executar a API REST do OData e testar os endpoints usando solicitações HTTP.
Inicie o aplicação ASP .NET Core.
A partir do seu diretório RestaurantODataApi, execute o seguinte comando para compilar e iniciar o aplicação:
dotnet run
Se for bem-sucedida, a saída do comando será semelhante ao exemplo a seguir:
info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:5236 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down.
Teste seus endpoints OData.
Em um terminal separado, execute os seguintes comandos do curl para testar os pontos de conexão OData. Cada endpoint retorna dados JSON no formato OData que inclui informações de restaurantes da coleção sample_restaurants.restaurants. Se bem-sucedidos, seus comandos curl retornarão dados semelhantes às saídas de amostra fornecidas. Os comandos também limitam os resultados a 5 documentos.
Recupere todos os 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 bairro.
O comando a seguir recupera restaurantes que têm um
boroughvalor 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"} ]} Filtrar restaurantes por cozinha.
O comando a seguir recupera restaurantes que têm um
cuisinevalor 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"} ]}
Teste os recursos avançados de consulta do OData.
Você pode usar os pontos de conexão para executar queries complexas incluindo parâmetros e operadores de query do OData. Os seguintes comandos do curl testam estes recursos.
Filtrar por vários campos.
O comando a seguir usa operadores de query OData para recuperar documentos que têm um valor
boroughde"Queens"e um valornameque contém"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"} ]}% Faça o pedido e conte seus resultados.
O comando a seguir classifica os documentos que correspondem ao filtro
cuisinepor seu valor denamee conta o número total de documentos correspondentes: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"} ]}
Parabéns por concluir o tutorial de Início Rápido do EF, ASP .NET e OData! Depois de concluir essas etapas, você tem uma API ASP .NET Core OData REST que se conecta à implantação do MongoDB , retorna dados de restaurantes usando pontos de extremidade OData e oferece suporte a recursos avançados de query, como filtragem, classificação, paginação, seleção de campo e pesquisa.
Recursos adicionais
Para saber mais sobre os conceitos mencionados neste tutorial, consulte os seguintes recursos:
Documentaçãodo ASP .NET Core OData
Documentação doprotocolo OData
Documentação doprovedor do MongoDB Entity Framework Core
Documentação dodriver C# do MongoDB