visual tutorial studio para net mvc framework espaƱol descargar asp vb.net asp.net-web-api visual-studio-2015 sql-server-2012 ef-code-first

vb.net - tutorial - Error al actualizar la base de datos con Code-First: "Ya hay un objeto llamado ''algo'' en la base de datos".



web api rest c# (1)

Estoy haciendo la migración de la base de datos usando Code-First en Visual Studio 2015. En el camino, hice los pasos de migración hasta Add-Migration.

Después de agregar migración, agregué esta línea de código

Database.SetInitializer(New MigrateDatabaseToLatestVersion(Of DbContext1, Migrations.Configuration))

en mi constructor de DbContext para configurar el inicializador de la base de datos ya que perdí este paso anteriormente. Después de eso, ejecuté

"Add-Migration initial -Force"

en la consola de Package Manager porque me temo que esta parte es necesaria en el proceso Add-Migration. Entonces, me ejecuté directamente

"Update-Database"

El problema es después de que hice esto, sale un error

Esta operación requiere una conexión a la base de datos ''maestra''. No se puede crear una conexión a la base de datos ''maestra'' porque la conexión de la base de datos original se ha abierto y las credenciales se han eliminado de la cadena de conexión. Proporcione una conexión sin abrir.

ADICIONAL

Después de reiniciar mi computadora, el error anterior no apareció más cuando ejecuté ''Update-Database''. En cambio, salió otro error:

Ya hay un objeto llamado ''algo'' en la base de datos.

Vi un hilo de respuesta sugiriendo ejecutar

Add-Migration Initial -IgnoreChanges

seguido por

Update-Database -verbose

Intenté ambas cosas, pero todavía muestra el mismo error.


Para poder solucionar sus problemas, debe comprender cómo EF trata con las cadenas de conexión y cómo funcionan las migraciones.

Cómo maneja EF las cadenas de conexión : por lo general, su DbContext tiene un constructor sin parámetros, que llama al constructor de su clase base con un nombre de cadena de conexión codificado. Su proyecto app.config o archivo web.config debe contener una sección connectionStrings que define una cadena de conexión con ese nombre. Esta es la cadena de conexión predeterminada utilizada en su proyecto cuando no proporciona explícitamente un parámetro de cadena de conexión a los comandos de la consola de Package Manager.

Algunos ejemplos de código con un nombre de cadena de conexión MyConnectionStringName :

public class MyDbContext : DbContext { public MyDbContext() : base("MyConnectionStringName") { ... } ... }

Y en su archivo .config :

<configuration> ... <connectionStrings> <add name="MyConnectionStringName" connectionString="..." /> </connectionStrings> </configuration>

Si no usa ese enfoque, todavía puede proporcionar manualmente la cadena de conexión correcta como un parámetro para Update-Database en la consola del Administrador de paquetes de esta manera:

Update-Database -ConnectionString <your connection string here> -ConnectionProviderName System.Data.SqlClient

También puede usar cualquier nombre de cadena de conexión que haya definido en su archivo .config :

Update-Database -ConnectionStringName MyConnectionStringName

Y ahora sobre cómo funcionan las migraciones : las migraciones son archivos de código. Cada vez que ejecuta Add-Migration se genera / actualiza un archivo de código, generalmente en una carpeta llamada Migrations dentro de su proyecto. El nombre de un archivo de migración se compone con una marca de tiempo de su generación concatenada con el nombre utilizado al ejecutar Add-Migration . Puede verificar el contenido de esos archivos y ver los efectos de ejecutar Add-Migration . También puede modificarlos una vez generados, y agregar su propio código, aunque no debería necesitar hacerlo por el momento.

Las migraciones están destinadas a ser incrementales. Empieza con una migración Initial , y cada vez que cambia el código de su modelo genera un nuevo archivo de migración. La base de datos contiene una tabla llamada __MigrationsHistory que mantiene el rastro de las migraciones que se han ejecutado en su base de datos.

Cada migración individual tiene un método Up y un método Down . Cuando ejecuta Update-Database siempre hay dos parámetros implícitos: SourceMigration y TargetMigration . EF aplica incrementalmente los métodos Up de todas las migraciones entre SourceMigration y TargetMigration (o los métodos Down si está degradando su base de datos). El escenario predeterminado cuando no especifica los parámetros SourceMigration y TargetMigration es que SourceMigration es la última migración aplicada a la base de datos y TargetMigration es la última de las pendientes. EF determina esos parámetros consultando la tabla __MigrationsHistory de la base de datos predeterminada de su proyecto, por lo que si esa base de datos no está en un estado consistente, sus migraciones pueden generarse de manera incorrecta. Creo que esto es lo que está causando tus problemas.

Así que cada vez que ejecuta Update-Database EF busca en la tabla __MigrationsHistory para saber qué migraciones deben ejecutarse, dependiendo del estado de su base de datos, y después de ejecutar el SQL de las migraciones, se inserta un nuevo registro en esa tabla para cada migración aplicada .

Parece que en algún momento tu base de datos __MigrationsHistory . Sucede cuando se ejecuta la Update-Database y Add-Migrations sin seguir el orden correcto y utilizando el parámetro -force .

Mi consejo para solucionar sus problemas : comience desde cero: elimine su base de datos, elimine sus archivos de migración, genere una nueva migración Initial limpia con Add-Migration Initial , ejecútelo solo una vez con Update-Database . A partir de ese momento, cada vez que modifique el código de su modelo, generará una nueva migración incremental con Add Migration YourNewMigrationName , utilizando diferentes nombres cada vez, y aplicará la nueva migración ejecutando Update-Database una vez.

Nota: En lugar de las migraciones incrementales, si tiene un conocimiento suficientemente bueno sobre cómo funcionan las migraciones, también puede usar solo una migración Initial y actualizarla cada vez que cambie el código de su modelo, mediante la ejecución Add-Migrations Initial -force . El parámetro -force asegura que en lugar de generar un nuevo archivo de migración, se sobrescribirá su archivo de migración Initial existente. Este enfoque es útil en la fase de desarrollo, pero en la producción generalmente no es un buen enfoque, ya que es probable que desee ejecutar las actualizaciones de la base de datos cada vez que implemente una nueva versión de su código (probablemente no podrá abandonar su base de datos). y vuelva a crearlo, y también deberá mantener sus datos y asegurarse de no perder datos al actualizar su base de datos).

Las migraciones son archivos de código que genera EF para crear y actualizar su base de datos. Cuando ejecuta Update-Database las migraciones se convierten a SQL, que se ejecuta en su base de datos. Si desea ver el SQL exacto que se genera para una migración específica, puede ejecutar Update-Database -Script -SourceMigration SomeMigration -TargetMigration SomeOtherMigration . Este comando no modifica la base de datos, solo genera y muestra el SQL que se aplicaría en la ejecución real de la Update-Database .

Puede encontrar más información sobre cómo generar y ejecutar migraciones aquí .

¡Buena suerte!