Hasta el momento tenemos lista nuestra base de datos, nuestro contexto con las entidades y nuestro controller configurado para con el soporte OData. Pero no termina acá, falta agregar los servicios necesarios en nuestro program.cs.
Lo primero que debemos agregar es el siguiente método estático el cual configura y activa OData para nuestra entidad Product:
static IEdmModel GetEdmModel() { ODataConventionModelBuilder builder = new(); builder.EntitySet<Product>("Products"); return builder.GetEdmModel(); }
Luego agregar a los servicios ODATA:
builder.Services .AddControllers() .AddOData(opt => opt.AddRouteComponents("v1", GetEdmModel()).Filter().Select().Expand());
Te dejo el program.cs completo:
using Demo.OData.Models; using Demo.OData.Services; using Microsoft.AspNetCore.OData; using Microsoft.EntityFrameworkCore; using Microsoft.OData.Edm; using Microsoft.OData.ModelBuilder; static IEdmModel GetEdmModel() { ODataConventionModelBuilder builder = new(); builder.EntitySet<Product>("Products"); return builder.GetEdmModel(); } var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext<AdventureWorksContext>( options => options.UseSqlServer(builder.Configuration.GetConnectionString("Default")) ); builder.Services .AddControllers() .AddOData(opt => opt.AddRouteComponents("v1", GetEdmModel()).Filter().Select().Expand()); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new() { Title = "Demo.OData", Version = "v1" }); }); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Demo.OData v1")); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
Bien, todo listo, ha llegado el momento de las pruebas. Ejecutaremos la com aplicación, si todo está correcto nos lanzará un navegador donde podremos visualizar los servicios que tenemos por medio de la interfaz de Swagger.
Vamos a probar los GET. Como comentamos antes, es posible pasarle parámetros. Pero primero vemos al Get que tiene como parámetro el Pagesize, nos de
Ahora supongamos que solamente quiere traerme el nombre, muy simple, podemos usar el parámetro $select=name
Si deseamos traer por ejemplo, Name y Color, debemos usar $select=name, color. Lo siguiente será filtrar por el ProductId que es la Primary Key de la entidad.
https://localhost:7093/v1/Products/320?select=Name, Color
Probemos almacenar en la base de datos por medio del verbo POST. Algo que tenemos que tener presente, en nuestra base de datos de AdventureWorks, la tabla Products tiene relaciones. Así que si no le enviamos valores correctos de las relaciones fallará. En nuestra primera prueba enviaremos todos los datos de las foreign key.
Ahora supongamos que además de enviar estos valores, también queremos enviar Color porque es una columna de la entidad. Podemos hacerlo:
Esto nos indica que no es necesario que enviemos todos los campos si no los necesitamos podemos enviar los que nos interesen.
Ahora el patch, como comentamos antes, el patch solo hará un cambio a un producto por medio de key, vamos cambiar el color de la entidad anterior de blue a green.
Solo nos queda el delete, veamos como se ve en postman:
Conclusiones
La implementación de OData es bastante sencilla, tal vez un poco laboriosa al principio, pero una vez lista tiene interesantes beneficios. El que me gustaría destacar es la reducción de DTO (Data Transfer Object) que van desde nuestros servidores de backend hasta nuestros frontend reduciendo el tráfico de red. Espero que les haya gustado. En futuros post veremos algunas funcionalidades más de OData.