Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

1.5K
Views
Cambie la propiedad IDENTITY de una columna, la columna debe eliminarse y volver a crearse

Estoy usando EF Core 2.1

Esta fue mi definición de modelo inicial.

 public class Customer //Parent { public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } public BankAccount BankAccount { get; set; } } public class BankAccount { public int Id { get; set; } public string Branch { get; set; } public string AcntNumber { get; set; } public DateTime CreatedDate { get; set; } public int CustomerId { get; set; } public Customer Customer { get; set; } }

Pero me di cuenta de que tener Id e CustomerId es una sobrecarga ya que su relación uno a uno, puedo actualizar mi definición de modelo de cuenta bancaria como se muestra a continuación.

 public class BankAccount { public int Id { get; set; } public string Branch { get; set; } public string AcntNumber { get; set; } public DateTime CreatedDate { get; set; } public Customer Customer { get; set; } }

Mientras que en la clase DbContext definió la entidad principal como se muestra a continuación.

 HasOne(b => b.Customer).WithOne(c => c.BankAccount).HasForeignKey<BankAccount>(f => f.Id);

Mientras ejecuto la update-database recibo el siguiente error.

System.InvalidOperationException: para cambiar la propiedad IDENTITY de una columna, la columna debe descartarse y volver a crearse.

Sin embargo, idealmente no debería sino simplemente deshacerme de este error, eliminé la columna, las restricciones y también la tabla y luego la base de datos completa también. Pero sigue siendo el mismo error.

over 4 years ago · Santiago Trujillo
11 answers
Answer question

0

Este error ocurre cuando intenta alterar o modificar una tabla que ya existe cuando desea cambiar el esquema o la tabla que ya existe, cuyo núcleo EF aún no lo admite, pero necesita una acción manual. esto es lo que puede hacer al respecto:

  • Comente el código relacionado en el archivo de migración para evitar este error.
  • o Eliminar archivos de migración y crear uno nuevo.
  • Elimine la migración ascendente y deje que la migración genere código nuevo.
over 4 years ago · Santiago Trujillo Report

0

Tuve este problema cuando intenté cambiar un modelo de public byte Id {get; set;} a public int Id {get; set;} . Para enfrentar el problema, hice lo siguiente:

  1. Elimine todas las migraciones hasta la creación del modelo de destino con Remove-Migration -Project <target_project> en Package Manager Console
  2. Eliminar la base de datos real
  3. Si tiene algunas migraciones en el medio que no ha creado (por ejemplo, provienen de otra rama), copie los archivos de migraciones y también el archivo ModelSnapshot y péguelos en su rama (¡sobrescríbalos con cuidado!).
  4. cree una nueva migración con add-migration <migration_name> en la consola del administrador de paquetes
  5. actualice la base de datos con update-database en la consola del administrador de paquetes

Puedo resolverlo de esta manera porque mi código no estaba en un entorno de producción. Tal vez tengas que enfrentar otros problemas complejos si el modelo ya está allí.

over 4 years ago · Santiago Trujillo Report

0

Me encontré con el mismo problema y lo resolví en dos pasos y dos migraciones:

Paso 1

  1. Suelta la columna de identidad.
  2. Comente el ID en BankAccount y agregue uno nuevo (es decir, BankAccountId como
    identidad, agregar migración y actualización: esto elimina la identificación).
  3. Agregue una nueva columna como identidad.

Paso 2

  1. Suelte la columna recién agregada y vuelva a agregar la anterior. Comente BankAccountId y elimine el comentario de ID.
  2. Agregue migración y actualización (esto descarta BankAccountId y agrega Id como identidad).
over 4 years ago · Santiago Trujillo Report

0

En mi caso, la tabla SharedBalances se renombra como Balances y su columna de identidad SharedBalancesId se renombra como BalanceId. Los comandos SQL se ejecutan en SQL Server. También puede probar la migraciónBuilder.Sql (my_sql_command_here)

Creé la migración y obtuve el mismo error.

Cambie el nombre de la columna y la tabla usando el comando TSQL:

 EXEC sp_RENAME 'SharedBalances.SharedBalanceId', 'BalanceId', 'COLUMN'; EXEC sp_RENAME 'SharedBalances', 'Balances'; -- Caution: Changing any part of an object name could break scripts and stored procedures.

Comente el comando RenameTable en su migración:

 /* migrationBuilder.RenameTable( name: "SharedBalances", newName: "Balances"); */

Comente el comando AddPrimaryKey en su migración:

 /* migrationBuilder.DropPrimaryKey( name: "PK_SharedBalances", table: "Balances"); migrationBuilder.AddPrimaryKey( name: "PK_Balances", table: "Balances", column: "BalanceId"); */

Actualice las ocurrencias de los comandos DropForeignKey del nombre de la tabla en su migración:

De esto....

 migrationBuilder.DropForeignKey( name: "FK_SharedBalances_Users_OwnerUserId", table: "SharedBalances"); migrationBuilder.DropPrimaryKey( name: "PK_SharedBalances", table: "SharedBalances");

A esto:

 migrationBuilder.DropForeignKey( name: "FK_SharedBalances_Users_OwnerUserId", table: "Balances"); migrationBuilder.DropPrimaryKey( name: "PK_SharedBalances", table: "Balances");

Ahora su migración funcionará. Así sucedió:

over 4 years ago · Santiago Trujillo Report

0

por favor siga este paso:

1-haga todo el cambio de columna de identidad en el servidor sql (no en el marco de la primera entidad de su código)

Cambios en la columna de identidad de 2 comentarios en la migración (archivo .cs)

3-actualizar-base de datos

disfrutalo

over 4 years ago · Santiago Trujillo Report

0

Tuve que:

  1. Comenta la tabla totalmente desde el código.
  2. Ejecute una migración que lo elimine de DB
  3. Descomente la tabla nuevamente con el mapeo corregido
  4. Vuelva a ejecutar la migración

Hecho

over 4 years ago · Santiago Trujillo Report

0

En mi opinión, ejecutar las migraciones de EF contra cualquier cosa que no sea su base de datos de desarrollo está buscando problemas, ya que está naturalmente limitado por el hecho de que las migraciones de EF a veces se niegan rotundamente a funcionar cuando se altera la estructura de sus objetos (cambiando las claves principales y cambiando las claves externas siendo los que se encuentran con más frecuencia).

Durante muchos años, he usado herramientas para garantizar que el esquema de base de datos esté incluido en el control de versiones (complementario a las migraciones de EF). Haga sus desarrollos para cambiar su base de datos de desarrollo (donde los datos no son importantes), cree múltiples migraciones pero luego use las herramientas para incorporarlas en un script de implementación de base de datos.

Aquí hay un resumen de lo que haría en este caso: -

  1. Eliminar (comentar) todas las referencias a la clase anterior BankAccount
  2. Crear migración y aplicar a la base de datos de desarrollo
  3. Vuelva a agregar la clase BankAccount con su definición corregida
  4. Crear migración y aplicar a la base de datos de desarrollo
  5. Use una herramienta de comparación de bases de datos (mi preferencia es APEX SQL Diff, pero hay otras en el mercado) para crear un script de implementación que incluya ambas migraciones.
  6. Pruebe este script en su entorno de prueba (donde debería tener algunos datos)
  7. Si la prueba es buena aplicar a Producción

La realidad es que si tiene datos de producción en los que desea cambiar radicalmente la estructura con un primer enfoque de código, probablemente terminará mal para usted a menos que comprenda y aborde la migración de datos de una estructura a otra.

over 4 years ago · Santiago Trujillo Report

0

Me encontré con el mismo problema (en mi caso no tenía ningún dato en las tablas), y lo resolví de esta manera (no es la forma correcta, pero funcionó para mí):

  1. Eliminé manualmente las migraciones del proyecto EFCore. También eliminé esas líneas que se agregaron del archivo _ContextModelSnapshot. (Tuve una migración que se aplicó y otra que se creó pero no se aplicó, ya que recibí un error: cambie la propiedad IDENTITY de una columna, la columna debe eliminarse y volver a crearse )
  2. Eliminé manualmente las tablas que se crearon en la base de datos (por la primera migración)
  3. Eliminé la fila en la tabla _EFMigrationHistory, la que estaba relacionada con la migración que quería eliminar.
  4. Vuelva a ejecutar VS
  5. Agregar migración NewOneCleanMigration
  6. Actualizar base de datos
over 4 years ago · Santiago Trujillo Report

0

Para aquellos que son perezosos como yo: desea cambiar el tipo de datos de una columna de clave principal "Id" de int a Guid en una tabla llamada "Traducciones" como fue mi caso.

  1. Su migración generada en ese caso es
 migrationBuilder.AlterColumn<Guid>( name: "Id", table: "Translations", type: "uniqueidentifier", nullable: false, oldClrType: typeof(int), oldType: "int") OldAnnotation("SqlServer:Identity", "1, 1");

Puedes eliminarlo o comentarlo

  1. Del error de actualización de la base de datos System.InvalidOperationException: para cambiar la propiedad IDENTITY de una columna, la columna debe eliminarse y volver a crearse .
  2. También sabemos que no podemos eliminar la columna sin eliminar primero la restricción de clave principal. Nuestra nueva migración se convierte en
 migrationBuilder.DropPrimaryKey( name: "PK_Translations", table: "Translations");
 migrationBuilder.DropColumn( name: "Id", table: "Translations");
 migrationBuilder.AddColumn<Guid>( name: "Id", table: "Translations", type: "uniqueidentifier", nullable: false);

Recuerde hacer lo contrario en el método de anulación hacia abajo en caso de que desee revertir la migración.

over 4 years ago · Santiago Trujillo Report

0

Tuve un problema similar en el que estaba cambiando el componente de navegación relacional de la configuración de una tabla de WithMany a WithRequiredDependent . El marco de la entidad quería eliminar el índice y volver a crear la columna, aunque nada en la base de datos debería haber cambiado.

Para solucionar esto, volví a montar la última migración, lo que permitió a la entidad absorber el cambio sin que se creara ninguna nueva migración. Puede reestructurar la última migración revirtiendo la migración desde la base de datos de destino y volviendo a ejecutar el script Add-Migration para la última migración con exactamente el mismo nombre de migración.

over 4 years ago · Santiago Trujillo Report

0

  1. La tabla no tiene datos importantes
  • Cambie el nombre de la tabla entity.ToTable("BankAccount2")
  • Añadir Ejecutar migración Add-Migration BankAccountTempChanges
  • Actualizar la base de datos Update-Database
  • Vuelva a renombrar la entidad de la entity.ToTable("BankAccount")
  • Add Ejecutar migración Add-Migration BankAccountOk
  • Actualice la base de datos nuevamente Update-Database
  1. La tabla tiene datos para no perderse
  • Aplicar la solución de la respuesta de @Hani
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!