entity framework 6 - tools - Nombre de objeto no válido ''dbo.__ MigrationHistory'' usando Database.Create; EF6.02 cuando se pasa la cadena de conexión
nuget package entity framework 5 (3)
Experimenté un error al intentar crear una base de datos utilizando el siguiente código. Tenga en cuenta que el problema no ocurre si no se pasa la cadena de conexión. También ocurre cuando ejecuto el programa en el IDE. No sucede si ejecuto el programa .exe o si ejecuto las pruebas unitarias dentro del IDE.
Sin embargo, si la base de datos se crea ejecutando las pruebas unitarias o ejecutando el .EXE, la tabla __MigrationHistory
se crea en la sección de tablas principales, no en las tablas del sistema.
public Context(string connString, bool AddInitialRecords )
: base(connString ?? "MyContextName")
{
this.CheckDatabase(AddInitialRecords);
}
public void CheckDatabase(bool AddInitialRecords)
{
if (this.Database.Exists())
{
// upgrade stuff
}
else
{
Database.Create(); // error occurs here
// seeding stuff
}
No consigo el problema si solo uso algo como
var db1 =new Context();
db1.Database.CreateIfNotExists();
He encontrado alguna documentación here pero me confunde. ¿Estoy instalando desde una "compilación estable" seguramente no estoy experimentando algo desde 2012? ¿Qué podría estar haciendo mal con PM?
El mensaje de error para el problema es ...
Se produjo System.Data.Entity.Core.EntityCommandExecutionException
HResult = -2146232004 Mensaje = Se produjo un error al ejecutar la definición del comando. Vea la excepción interna para más detalles.
Source = EntityFramework StackTrace: at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands (EntityCommand.). Com. ''. Fuente = .Net SqlClient Data Provider ErrorCode = -2146232060 Class = 16 LineNumber = 1 Number = 208 Procedure = "" Server =. / SQLEXPRESS State = 1 StackTrace: at System.Data.SqlClient.SqlConnection.OnError (SqlException exception, Boolean breakConnection , Action`1 wrapCloseInAction) en System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) en System.Data.SqlClient.TdsParser.TryRun (runBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader corriente de datos, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject estado de la empresa que funciona en el sistema de los datos del sistema de la actividad física. System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, tiempo de espera de Int32, Task & task, Boolean asyncWrite) en System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Vencedor de tiempo en el interior de la casa de la casa de la fuente de la cía de la paz, de la paz, de la paz, de la tierra, de la paz, de la paz, de la ciudad, de la paz, de la paz, de la paz, de la ciudad, de la tierra, de la paz, de la ciudad, de la tierra, de la tierra, de la tierra .Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, runBehavior runBehavior, Boolean returnStream, método String) en System.Data.SqlClient.SqlCommand.ExecuteReader (comportamiento CommandBehavior, método String) en System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (CommandBehavior comportamiento) en System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher. <> c__DisplayClassb.b__8 () en System.Data.Entity.Infrastructure.Interception.Trivea un grupo de personas en las categorías de objetos de las personas o grupos. interceptionContext, Action`1 se ejecuta, Action`1 se ejecuta) en System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader (comando DbCommand, Db CommandInterceptionContext interceptionContext) at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader (CommandBehavior comportamiento) en el sistema. Data.
Esto sucede porque EF realiza un sondeo para la tabla __MigrationsHistory. Por ejemplo, puede usar EF con una base de datos existente que no se creó con EF Migrations pero EF no tiene forma de saberlo, por lo que intenta conectarse a la base de datos y usa la tabla para verificar esto. Si la tabla no existe se lanzará una excepción. EF luego captura la excepción y hace lo correcto (por ejemplo, crea la tabla __MigrationsHistory si es necesario o continúa sin usar migraciones).
En general, no verá esta excepción cuando se ejecuta sin el depurador. Sin embargo, cuando se depura su código Y cuando se establece la opción de interrumpir la ejecución cuando se lanza una excepción, verá todas las excepciones que se lanzan, incluso si se manejan internamente y nunca llegan a su código. La configuración predeterminada no es interrumpir cuando se lanza la excepción, sino solo cuando se lanza una excepción que no se está manejando. Puede cambiar la configuración marcando / desmarcando una casilla de verificación en la columna "Lanzar" en el cuadro de diálogo Depurar -> Excepciones.
En VS 2017, abre la configuración de excepciones usando Depuración-> Windows-> Configuración de excepciones. Si hace clic con el botón derecho en "Excepciones de Common Language Runtime", puede seleccionar "Restaurar valores predeterminados" que desactiva la interrupción de su programa cuando se producen la mayoría de las excepciones.
Me enfrenté al mismo problema. Esto significa que EF no puede encontrar la tabla del historial de migración. También tenga en cuenta que por alguna razón tiene que ser dbo .__ MigrationHistory (note dbo). Asegúrese de haber ejecutado "update-database" al menos una vez antes de ejecutar el Contexto
Puede desactivar el código de inicialización de la base de datos para su base de datos, agregando esto al constructor de su contexto:
Database.SetInitializer<YourContext>(null);
Esto debería evitar el intento de acceder a dbo.__MigrationHistory
.