es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error de EF Core Code First: la clave (“Id”)=(33) ya existe.

Estoy haciendo un crud para la tabla “Destinations” en un proyecto de asp.net core. (usando el método EF Core de código primero)

Cuando creo un nuevo Destino, obtengo un error en la consola de depuración como este.

Datos de la excepción:
    Mensaje: el valor clave duplicado viola la restricción única "PK_Destinations"
    Detalles: La clave ("Id")=(33) ya existe.
    Nombre de esquema: public
    Nombre de tabla: Destinations
    Nombre de restricción: PK_Destinations

Por algunas razones, ya hemos creado una tabla Destinations y agregado datos manualmente. Y ahora estamos haciendo un crud para esa tabla. Supongo que por eso se produce este error “La clave (“Id”)=(33) ya existe”.

DbContext.cs

public DbSet<destination> Destinations { get; set; }

service.Cs

public async Task<destination> Create(Destination destination)
{
    await _catalogDbContext.Destinations.AddAsync(destination);
    await _catalogDbContext.SaveChangesAsync();
    return destination;
}

Mi pregunta es:
– Tengo 100 filas en mi tabla. No podemos eliminarlas. Por lo tanto, la ID del destino debe comenzar desde 301 cuando se agrega un nuevo destino.

Nuestra base de datos de desarrollo tiene 200 filas en nuestra tabla. No podemos eliminarlas. Por lo tanto, la ID del destino debe comenzar desde 201 cuando se agrega un nuevo destino.

Nuestra base de datos de producción tiene 240 filas en nuestra tabla. No podemos eliminarlas. Por lo tanto, la ID del destino debe comenzar desde 241 cuando se agrega un nuevo destino.

¿Cómo puedo hacer que cuando se crea un destino, la ID comience desde 101, 201 o 241? Y la ID debe incrementarse automáticamente después de agregar uno nuevo.

Editar:
Destination.cs
“`
public class Destination
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; private set; }

<pre><code>[Required]
public string Continent { get; set; }

[Required]
public string Country { get; set; }

[Required]
public string Iso { get; set; }

[Required]
public string Name { get; set; }
</code></pre>

}
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para comenzar el Id de Destinations desde un número específico, puedes configurarlo en el método OnModelCreating de tu clase DbContext. Aquí tienes un ejemplo:

    public class CatalogDbContext : DbContext
    {
        public CatalogDbContext(DbContextOptions options) : base(options) {}
    
        public DbSet<destination> Destinations { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<destination>().Property(d => d.Id)
                .HasDefaultValue(0)
                .ValueGeneratedOnAdd();
    
            // Reemplaza 101 por 201 o 241 para otras bases de datos
            modelBuilder.Entity<destination>().HasData(
                new Destination { Id = 101, Continent = "Asia", Country = "Japan", Iso = "JP", Name = "Tokyo" }
                // Agrega más datos aquí...
            );
        }
    }
    

    En este ejemplo, la propiedad Id de Destination está configurada para tener un valor predeterminado de 0 (que será reemplazado por un nuevo valor generado por la base de datos), y para generarse al agregarlo. Luego, usamos el método HasData para agregar algunos datos de ejemplo, con un Id que comienza en 101. Reemplaza este valor por 201 o 241 dependiendo de tu base de datos. Cuando se agregue un nuevo Destination, la base de datos generará automáticamente un valor nuevo y único para su Id.

Comments are closed.