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.
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:
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:
Remove-Migration -Project <target_project> en Package Manager ConsoleModelSnapshot y péguelos en su rama (¡sobrescríbalos con cuidado!).add-migration <migration_name> en la consola del administrador de paquetesupdate-database en la consola del administrador de paquetesPuedo 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í.
Me encontré con el mismo problema y lo resolví en dos pasos y dos migraciones:
Paso 1
Paso 2
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ó:
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
Tuve que:
Hecho
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: -
BankAccountBankAccount con su definición corregidaLa 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.
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í):
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.
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
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.
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.
entity.ToTable("BankAccount2")Add-Migration BankAccountTempChangesUpdate-Databaseentity.ToTable("BankAccount")Add-Migration BankAccountOkUpdate-Database