update tutorial migraciones habilitar framework first español crear code c# asp.net-mvc entity-framework ef-migrations

c# - tutorial - Cambio de datos en la migración. Método up-Entity Framework



migraciones entity framework core (4)

He añadido una nueva propiedad en mi modelo existente. Es una propiedad bool con valor predeterminado verdadero. Hay datos existentes en esta tabla y me gustaría establecer la propiedad nueva de una fila específica en falso justo después de crear el nuevo campo, en el método Arriba.

public override void Up() { AddColumn("dbo.RequestValidationErrors", "IsBreaking", c => c.Boolean(nullable: false)); using (Context ctx = new Context()) { var validation = ctx.RequestValidationErrorSet.FirstOrDefault(x => x.WordCode == "RequestValidationError.MoreThanOneItemFound"); if (validation != null) { validation.IsBreaking = false; ctx.SaveChanges(); } } }

De esta manera EF lanza un error al decir

System.InvalidOperationException: el modelo que respalda el contexto ''DbContext'' ha cambiado desde que se creó la base de datos. Considere el uso de Code First Migrations para actualizar la base de datos

¿Es posible cambiar la base de datos aquí o debo hacerlo en otro lugar?


En lugar de usar el método Sql , también podría usar el método UpdateData .

migrationBuilder.UpdateData( table: "RequestValidationErrors", keyColumn: "WordCode", keyValue: "RequestValidationError.MoreThanOneItemFound", column: "IsBreaking", value: false);

(No sé si solo ef core soporta este método)


En medio de una migración, es mejor usar el método Sql() para actualizar los datos de la base de datos.

Sql("UPDATE dbo.RequestValidationErrors SET IsBreaking = 0 WHERE WordCode = ''RequestValidationError.MoreThanOneItemFound''");

También debe definir el valor predeterminado para la nueva columna. Entonces la solución debería ser algo como esto:

public override void Up() { AddColumn("dbo.RequestValidationErrors", "IsBreaking", c => c.Boolean(nullable: false, default: true)); Sql("UPDATE dbo.RequestValidationErrors SET IsBreaking = 0 WHERE WordCode = /"RequestValidationError.MoreThanOneItemFound/""); }

Usar un DbContext en medio de su migración es muy ambiguo. ¿Qué esperas del contexto? Tiene el estado posterior a la migración en sus modelos, pero la base de datos tiene el estado anterior a la migración en las tablas. Así que el modelo y la base de datos no coinciden. Si aún insiste en usar DbContext en su código, deshabilitar la verificación de modelos podría ser la solución. Puede deshabilitar la verificación de modelos usando:

Database.SetInitializer<Log4ProContext>(null);


Escribir DataMigrations para EF6 puede ser una tarea. Creamos una biblioteca para el uso de otras fuentes, que se agrega a esta característica faltante y largamente prometida para EF6. Solo escribe clases usando consultas regulares de EF, etc.

https://github.com/b9chris/Brass9.Data


Si desea utilizar el marco para cambios como este, debe separar los cambios en la base de datos de los cambios en los datos.

Cree una migración solo para los cambios en la base de datos y ejecútela.

Luego cree una nueva migración (los métodos Arriba () y Abajo () estarán vacíos). Ahora puede crear una instancia de DatabaseContext y no habrá ningún error. De esta manera, puede usar el Marco para estos cambios e implementar correctamente un método Abajo ().