https://www.telerik.com/blogs/10-awesome-csharp-refactoring-tips
Categoría: C#
Cambiar borrado de registros
En .NET por defecto se eliminan los registros relacionados en cascada. Para evitarlo antes de actualizar la base de datos tenemos que cambiar la migración:
constraints: table => { table.PrimaryKey("PK_ProfesionalesActividades", x => x.Id); table.ForeignKey( name: "FK_ProfesionalesActividades_Actividad_ActividadId", column: x => x.ActividadId, principalTable: "Actividad", principalColumn: "Id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_ProfesionalesActividades_Profesionales_ProfesionalId", column: x => x.ProfesionalId, principalTable: "Profesionales", principalColumn: "Id", onDelete: ReferentialAction.Restrict); });
Para que por defecto sea así en todas las relaciones lo tenemos que poner en el contexto:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); foreach (var foreignKey in modelBuilder.Model.GetEntityTypes() .SelectMany(e => e.GetForeignKeys())) { foreignKey.DeleteBehavior = DeleteBehavior.Restrict; } }
Y si la cosa ya está hecha añadimos una migración a mano:
In the Package Manager Console, create a new, empty migration with the Add-Migration command, then fill in the Up method like this: migrationBuilder.DropForeignKey( name: "FK_ElementsPerStrip_Strips_StripId", table: "ElementsPerStrip"); migrationBuilder.AddForeignKey( name: "FK_ElementsPerStrip_Strips_StripId", table: "ElementsPerStrip", column: "StripId", principalTable: "Strips", principalColumn: "Id", onDelete: ReferentialAction.Restrict); For completeness, do the opposite in the Down method: migrationBuilder.DropForeignKey( name: "FK_ElementsPerStrip_Strips_StripId", table: "ElementsPerStrip"); migrationBuilder.AddForeignKey( name: "FK_ElementsPerStrip_Strips_StripId", table: "ElementsPerStrip", column: "StripId", principalTable: "Strips", principalColumn: "Id", onDelete: ReferentialAction.Cascade);
Evitar ciclos en la API
builder.Services.AddControllers().AddJsonOptions(x =>
x.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles);
o
[JsonIgnore]
Deshabilitar CORS
using Microsoft.EntityFrameworkCore; using Profesiones.Models; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); builder.Services.AddDbContext<Contexto>(options => options.UseSqlServer("Server=.\\SQLExpress;Database=Profesiones;Trusted_Connection=True;")); builder.Services.AddCors(options => { options.AddPolicy("AllowAll", builder => { builder .AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader(); }); }); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseCors("AllowAll"); app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
Ejemplo API
API MVC
Ejercicio para el verano
Vamos a crear una web para control de eventos.
Un evento tiene un título, una fecha, una categoría, un número máximo de participantes y una descripción.
Las categorías solo tienen un nombre.
En la web podremos dar de alta usuarios que tendrán un nombre, un telefono y un mail.
Vamos a crear el mantenimiento de esto. Podemos dar de alta categorías, eventos y usuarios. También podemos asignar usuarios a eventos.
Una vez hecho lo básico vamos a poder:
Dentro de los eventos ver la lista de los apuntados y poder apuntar usuarios.
Si se ha alcanzado el número máximo de participantes no podemos apuntar.
Podemos desapuntar a los usuarios.
Dentro del usuario ver la lista de eventos a los que se ha apuntado. Poder apuntarse desde el detalle.
Dentro de las categorías ver la cantidad de eventos que tiene cada una y que al clicar nos muestre los eventos de esa categoría.
Tener una pantalla calendario que seleccionando la fecha nos muestre los eventos de esa fecha y que podamos ir al detalle de ese evento.
Cualquier tipo de mejora de diseño, usabilidad, etcétera será apreciada.
Revisaré TODAS las webs.