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();

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.

Ejercicio MVC

En la web de profesionales añadir la funcionalidad que se ha visto en clase.
Implementarla también en las actividades (buscador, etc).
Coherencia en la web (mensajes, colores…)

En actividades ver en el index el número de profesionales por actividad. Que ese número sea un enlace al index de profesionales de los que tengan esa actividad.

Y lo que os de vuestra imaginación.