2012-08-16 16 views
19

Estoy migrando una aplicación MVC 3 de EF 4.3 a EF 5. Noté que EF 5 espera una columna CreatedOn en la tabla __MigrationHistory, que no existe porque las migraciones fueron creadas por una versión anterior.Entity Framework 5 espera la columna CreatedOn de la tabla MigrationHistory

SELECT TOP (1) 
[c].[CreatedOn] AS [CreatedOn] 
FROM [dbo].[__MigrationHistory] AS [c] 

¿Cómo resuelvo este problema sin borrar mi historial de migración? Estoy pensando en una consulta para inferir el valor de la columna del nombre de la migración, que está en el siguiente formato:

201203111201542_MigrationName 
+0

Esto parece ser un conflicto con MiniProfiler: http://community.miniprofiler.com/permalinks/99/sqlexception-on-ef-5 -w-net-4-5 – CMircea

Respuesta

5

La columna CreatedOn ya no es necesaria. Intentamos consultarlo para determinar si debemos soltarlo. es decir, está actualizando de 4.3 a 5.

+7

No veo cómo responde esto a la pregunta original: '¿cómo puedo resolver ...' – Spongman

+5

@SpongeMan: recibía esta excepción, pero resultó que accidentalmente había dejado Visual Studio configurado para romper todas las excepciones, no solo las no administradas. Entonces, aunque Andrew no lo dijo explícitamente, la resolución es desactivar las excepciones de primera oportunidad. Depurar-> Excepciones, luego desmarcar la columna lanzada. – HiredMind

5

Parece algo en el Código EF primero con migraciones habilitadas, cuando actualiza de EF4. * a EF 5.0. Y eso en combinación con MiniProfiler. La tabla existía en dbo._MigrationHistory en tablas del sistema.

Usted intentan hacer algunas cosas:

  1. Puede añadir CreatedOn columna (DateTime) manualmente a la mesa dbo._MigrationHistory en la carpeta tablas del sistema.
  2. Puede detener la detección de cambios configurando Configuration.AutoDetectChangesEnabled = false;
  3. Comenta esta línea MiniProfilerEF.Initialize(), deshabilitando el perfil de EF.

Aquí hay un ejemplo del método de inicialización para agregar la columna CreatedOn. Esta columna se eliminará cada vez que se inicialice el contexto. El método de inicialización está en la clase de configuración del contexto.

internal sealed class Configuration : DbMigrationsConfiguration<MyContext> 
{ 
    protected override void Seed(MyContext context) 
    { 
     // This method will be called after migrating to the latest version. 

     // Hide error Invalid column name 'CreatedOn' from mini profiler. 
     context.Database.ExecuteSqlCommand(
      @"IF NOT EXISTS(SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('__MigrationHistory') AND name = 'CreatedOn') 
       ALTER TABLE dbo.__MigrationHistory ADD CreatedOn datetime NOT NULL CONSTRAINT DF___MigrationHistory_CreatedOn DEFAULT (SYSUTCDATETIME()); 
     "); 
    } 
} 
+0

AutoDetectChanges = false en realidad no resuelve el problema, también ocurre con migraciones "manuales". Pero usted es, por supuesto, correcto con las otras dos soluciones. Gracias. –

+0

hmmm pensé que lo probé correctamente: p gracias por la información –

+0

Agregar un campo CreatedOn tampoco funciona, porque la próxima migración lo dejará caer instantáneamente y comenzará todo de nuevo. –

6

Al igual que Filip Cornelissen dijo, es una cosa entre MiniProfiler.EF y Entity Framework 5.0.

Resolver/ocultar el problema es realmente más fácil de lo que piensas. Es solo un "problema de depuración" ya que el error que obtendrá solo se producirá durante el período de creación de instancias (verificando nuevas migraciones), y el error es una "Excepción SQL Unhandeld".

Por lo tanto, la solución de este problema es fácil:

Ir en Visual Studio a la pestaña "Test". Presiona el ítem "Excepciones". En el nuevo cuadro de diálogo, abre el árbol "Common Language Runtime Exceptions". En "System.Data.SqlClient, desactive las dos casillas de verificación después de "System.Data.SqlClient.SqlException". Añadir que, si no está allí.

Y fuera ya go!

+11

Pero esto suprimirá todas las SqlExceptions .. –

+2

Sí lo hará. Pero hasta donde yo sé, EF no arroja (no maneja) excepciones SQL. Por lo tanto, es bastante seguro ignorar esas excepciones en sus proyectos con EF. –

4

Según la respuesta Filip Cornelissen El siguiente script corrige este problema

--IF OBJECT_ID('dbo.__MigrationHistory') IS NOT NULL 

ALTER TABLE dbo.__MigrationHistory ADD CreatedOn DateTime Default GETDATE() 
GO 
UPDATE dbo.__MigrationHistory SET CreatedOn = GETDATE() 
+5

Sí, lo hace, pero es solo temporal. ¡La columna CreatedOn se eliminará nuevamente! Solo es cuestión de tiempo. –

3

Aquí hay una solución provisional que estoy usando.En lo personal, estoy bien con pulsar la flecha verde dos veces (Inicio de la depuración y luego continuar), pero si realmente quieres que deje de romper, prueba este mensaje en Generar eventos que eliminará el MiniProfiler AP:

del "$(TargetDir)MiniProfiler.pdb" /q /s 

ACTUALIZACIÓN : si eso es demasiado trabajo para usted, he creado un NuGet package:

PM> Install-Package MiniProfilerContrib.EFMigrationsFix 
Cuestiones relacionadas