visual update tutorial studio remove mvc migrations framework force first existing español enable code entity-framework ef-code-first entity-framework-5 code-first-migrations

entity-framework - update - remove migration entity framework core



Códigos de migración de código de entidad de primer depuración (6)

Estoy usando el código de Entity Framework primero en mi sitio web y me pregunto si hay alguna forma de depurar los códigos de migración. Ya sabes, como establecer puntos de interrupción y cosas como esta.

Estoy usando la consola de Package Manager para actualizar la base de datos usando la base de datos de actualización.

Gracias


He tenido mucha suerte al utilizar "Debugger.Launch ()" (como en la respuesta de m_david anterior ) en cualquier otro lugar, pero dentro de CreateDbContext parece adjuntar y no adjuntar de alguna manera. Lo que quiero decir es que se adjunta y comienza a intentar entrar en archivos .asm y archivos .cpp (código interno). Si trato de establecer un punto de interrupción en una Console.Writeline que sé que se ejecutará después (puedo ver el resultado de CUALQUIER "comando de migraciones de dotnet ef"), ambos lo ejecutan y nunca llegan al punto de interrupción.

Esto es lo que funcionó para mí en su lugar:

while (!System.Diagnostics.Debugger.IsAttached) System.Threading.Thread.Sleep(10); // Breakpoint after this...

Puede ejecutar la migración y adjuntar manualmente con Visual Studio y realmente le permitirá avanzar paso a paso por el código como espera, simplemente es más doloroso. Lo que realmente debería intentar es la combinación de ambos métodos ...


Mi respuesta puede ser un poco tonta, pero de todos modos aquí va. Si usted, como yo, algunas veces tiene problemas en el método Seed (), lo que suelo hacer es simplemente crear un método público que llame a Protect Seed ().

public void SeedDebug(AppDbContext context) { Seed(context); }

luego en mi HomeController llamo a este método en modo Debug.

public class HomeController : Controller { var appDb = new AppDbContext(); public ActionResult Index() { var config = new Configuration(); config.SeedDebug(appDb); return View(); } }

Sé que es una solución poco convincente, pero es simple y rápida. Por supuesto, esto tiene que hacerse después de que se haya creado el modelo. Entonces paso a paso:

  1. Comente el método de inicialización y ejecute la base de datos de actualización para crear el modelo.
  2. descomenta el método Seed () y complementa el "hack" que mencioné anteriormente.

  3. en la configuración, deshabilitar migraciones automáticas

    AutomaticMigrationsEnabled = false; // si tiene esto desactivado, omita este paso

  4. Depure su aplicación, corrija el error y elimine el "hack"


Para alcanzar un punto de quiebre en una migración de db, establezca el contexto en MigrateDatabaseToLatestVersion en la inicialización.

Database.SetInitializer(new MigrateDatabaseToLatestVersion<EnterContextHere, Configuration>());

Luego, simplemente depure como es normal (ejecute usando f5) y el punto de interrupción se activará la primera vez que ejecute el proyecto.

El problema ahora es que si depura una segunda vez, la migración no se ejecutará. Esto se debe a que la tabla __MigrationHistory se ha actualizado para indicar que ha migrado a la última versión. Para volver a probar la migración, abra la consola del administrador de paquetes y descárguelo a la migración anterior:

Update-Database –TargetMigration: ThePreviousMigrationName


Podría agregar instrucciones Console.WriteLine al código de migración (no es una gran solución)

Tenga en cuenta que los mensajes solo se muestran si ejecuta el código de migración con la utilidad migrate.exe (en pacakges/EntityFramework.xyz/tools ). No se mostrarán si ejecuta la migración a través de la consola de Package Manager.


Sé que EF Code First Migrations es una herramienta relativamente nueva, pero no olvide que todavía está en .NET.

Entonces puedes usar:

if (System.Diagnostics.Debugger.IsAttached == false) { System.Diagnostics.Debugger.Launch(); }

Después de eso, puede ver su InnerException.

O puede usar try ... catch statement como este: Exception handling Entity Framework


También encontré un buen truco here para obtener los detalles del error ...

Básicamente, el truco consiste en tomar toda la información de una excepción, colocarla en una cadena y lanzar una nueva DbEntityValidationException con la cadena generada y la excepción original.