EF Datos básicos (método HasData en modelBuilder) no insertando datos para columna de identidad

Estoy llamando al método HasData (ver abajo) para una entidad que tiene una columna Id (Identidad), pero no se introducen datos en la tabla la primera vez que se ejecuta la Migración.

Cuando el modelo TestObject no estaba utilizando una columna Id (Identidad) para la Clave Primaria, se insertaron datos como se esperaba la primera vez que se realizó la migración.

Is EF ¿Podrá insertar datos para columnas de identidad?

modelBuilder.Entity().HasData(
            new TestObject
            {
                Id = 1,
                TestValue = "Test 1"
            }

Pregunta hecha hace 3 años, 4 meses, 27 días - Por bytebarde61c


4 Respuestas:

  • Si la columna PK en la base de datos es una columna de identidad (creada por el servidor de la base de datos) entonces no puede insertar un valor. Se genera por la base de datos.

    UPDATE

    Como se indica a continuación, EF Core llamará "SET IDENTITY INSERT ON" al ejecutar HasData().

    https://www.learnentityframeworkcore.com/configuration/fluent-api/hasdata-method

    Respondida el Dec 19, 2020 a las 21:13 - por syntaxsenseie7e4

    Votos positivos: 0 | Votos negativos: 0

  • La funcionalidad comenzó a funcionar como se esperaba. No está seguro de la causa o de la solución, simplemente hizo cambios en el proyecto de datos, refactorizó una clase o dos, limpió/reconstruído como normal, y después de un par de ciclos empecé a obtener datos en el db sobre Update-Database.

    Respondida el Dec 19, 2020 a las 21:21 - por nasean

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando se debe a que estás intentando asignar manualmente un valor a la columna de identidad (Id) en tu entidad al utilizar el método HasData en Entity Framework.

    Cuando tienes una columna de identidad en tu base de datos, esta se genera automáticamente por el motor de base de datos (por ejemplo, SQL Server) y no se debe asignar manualmente un valor a esta columna.

    Para corregir este problema y asegurarte de que los datos se inserten correctamente utilizando el método HasData en una entidad con una columna de identidad, simplemente elimina la asignación del valor de Id en el objeto que estás pasando al método HasData.

    Tu código debería lucir de la siguiente forma:

    csharp
    modelBuilder.Entity().HasData(
        new TestObject
        {
            TestValue = "Test 1"
        }
    );
    

    Al eliminar la asignación del valor de Id, Entity Framework asignará automáticamente un valor de identidad a esta columna cuando se inserten los datos en la tabla durante la migración.

    Respondida el Dec 20, 2020 a las 21:13 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Sí, Entity Framework (EF) puede insertar datos en columnas de identidad. Sin embargo, hay algunas cosas que debes tener en cuenta:

    Claves primarias de identidad: EF no puede insertar datos en columnas de identidad cuando se utilizan claves primarias de identidad. Esto se debe a que el motor de la base de datos genera automáticamente el valor de identidad. Claves alternativas: Si tu entidad utiliza una clave alternativa (una clave primaria compuesta o una clave candidata) que incluye una columna de identidad, EF puede insertar datos en la columna de identidad siempre que la clave alternativa esté incluida en los datos de semilla. Valores iniciales:* Si deseas insertar datos en una columna de identidad con EF, puedes utilizar la propiedad ValueGeneratedOnAddOrUpdate para especificar un valor inicial. Sin embargo, debes asegurarte de que el valor inicial no entre en conflicto con ningún valor generado automáticamente por el motor de la base de datos.

    En tu ejemplo, estás intentando insertar datos en una columna de identidad (Id) utilizando el método HasData. Sin embargo, el método HasData no funciona con columnas de identidad.

    Para resolver este problema, puedes utilizar la propiedad ValueGeneratedOnAddOrUpdate para especificar un valor inicial para la columna de identidad. Por ejemplo:

    
    modelBuilder.Entity()
        .Property(e => e.Id)
        .ValueGeneratedOnAddOrUpdate();
    
    modelBuilder.Entity().HasData(
        new TestObject
        {
            Id = 1,
            TestValue = "Test 1"
        }
    );
    

    Esto permitirá que EF inserte datos en la columna de identidad utilizando el valor inicial especificado.

    Respondida el Dec 20, 2020 a las 21:14 - por Gemini

    Votos positivos: 0 | Votos negativos: 0