visual update studio remove migrations framework force first existing enable code c# entity-framework ef-code-first entity-framework-5 ef-migrations

c# - update - Las migraciones de EF 5 no pueden conectarse a nuestra base de datos a pesar de que funcionan bien en el tiempo de ejecuciĆ³n



revert migration ef core (7)

Tenemos tres proyectos.

  • Company.Domain (biblioteca de clases)
  • Company.PublicWebsite (aplicación web MVC3)
  • Company.InternalWebsite (aplicación web MVC3)

Los dos proyectos del sitio web tienen referencia a Company.Domain .

Nuestro EF 5 DbContext vive en Company.Domain.Data.EntityFramework y se ve así:

using System.Data.Entity; using Company.Domain.Data.EntityFramework.Entities; namespace Company.Domain.Data.EntityFramework. { public class CompanyEntities : DbContext { public DbSet<Notification> Notifications { get; set; } public DbSet<Report> Reports { get; set; } public DbSet<ReportSection> ReportSections { get; set; } public DbSet<ReportPage> ReportPages { get; set; } // brevity brevity } }

Hemos habilitado las migraciones y hemos utilizado con éxito la herramienta en el pasado, por lo que no estoy seguro de por qué tenemos problemas ahora. Nuestra configuración de migraciones se encuentra en Company.Domain.Data.EntityFramework.Migrations y se ve así:

namespace Company.Domain.Data.EntityFramework.Migrations { using System; using System.Data.Entity; using System.Data.Entity.Migrations; using System.Linq; using Company.Domain.Data.EntityFramework; public class Configuration : DbMigrationsConfiguration<CompanyEntities> { public Configuration() { MigrationsDirectory = @"Data/EntityFramework/Migrations"; AutomaticMigrationsEnabled = false; } protected override void Seed(CompanyEntities context) { // empty at the moment } } }

Luego tenemos un archivo App.config en la raíz del proyecto Company.Domain y se ve así:

<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> </configSections> <connectionStrings> <add name="CompanyEntities" providerName="System.Data.SqlClient" connectionString="Data Source=devsql;Initial Catalog=CompanyEntities;uid=XXXXX;pwd=XXXXX;MultipleActiveResultSets=True;" /> </connectionStrings> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> </entityFramework> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> </configuration>

Nuestra base de datos vive en otro servidor de la red. Puedo conectarme a él en SQL Server Management Studio y nuestras aplicaciones pueden conectarse en tiempo de ejecución muy bien. Sin embargo, cuando intento ejecutar add-migration o incluso update-database , aparece el siguiente error:

http://content.screencast.com/users/Chevex/folders/Snagit/media/80fbfd6a-4956-407f-b88f-d5a53a9e5feb/03.21.2013-10.25.png

System.Data.ProviderIncompatibleException: se produjo un error al obtener información del proveedor de la base de datos. Esto puede ser causado por Entity Framework utilizando una cadena de conexión incorrecta. Verifique las excepciones internas para obtener detalles y asegúrese de que la cadena de conexión sea correcta. ---> System.Data.ProviderIncompatibleException: el proveedor no devolvió una cadena ProviderManifestToken. ---> System.Data.SqlClient.SqlException: Se produjo un error específico de la instancia o relacionado con la red al establecer una conexión a SQL Server. El servidor no se encontró o no estaba accesible. Verifique que el nombre de la instancia sea correcto y que SQL Server esté configurado para permitir conexiones remotas.

Incluso he revertido mis cambios al modelo y luego ejecuté la update-database solo para ver si decía "la base de datos está en la última migración", pero aún así recibí el error anterior. He vertido sobre la cadena de conexión en App.config una y otra vez. No puedo entender por qué las migraciones no se conectan, pero los dos proyectos de nuestro sitio web funcionan bien en el tiempo de ejecución. Las migraciones han funcionado en el pasado. A continuación se muestran las migraciones en el explorador de soluciones en comparación con las que se encuentran en la tabla __MigrationHistory en la base de datos.

http://content.screencast.com/users/Chevex/folders/Snagit/media/7abeaa46-ff0f-4817-a0d7-1adb086e8f0c/03.21.2013-10.30.png

http://content.screencast.com/users/Chevex/folders/Snagit/media/3c6ac54d-f63d-417f-9253-39b6a8fea85d/03.21.2013-10.32.png

Parece que debería poder ejecutar update-database y hacer que me diga que está actualizada, pero en su lugar me aparece ese error.

Como lo entiendo, las migraciones no deberían prestar atención a los dos proyectos de nuestro sitio web cuando estoy ejecutando los comandos de migración, pero vertí sus archivos Web.config también por si acaso. Las cadenas de conexión son idénticas a App.config.

Editar:

Incluso he intentado desinstalar por completo y eliminar el paquete EF 5 de los proyectos y reinstalarlo. Mismo problema> :(


Dice que puede conectarse a través de SQL Management Studio, pero supongo que utiliza la autenticación de Windows para eso, y no el uid=XXXXX;pwd=XXXXX; suministrado en su cadena de conexión.

Intente que Management Studio se conecte utilizando ese ID de usuario y contraseña.

Además, esa cuenta podría estar bloqueada (si es una cuenta de Active Directory).



OK, así que al principio no me funcionó :(

Luego, después de una taza de café y agregando StartUPProjectName, ¡lo hizo! Tratar:

Base de datos de actualización -StartUpProjectName MYPROJECT.NAME -Script

Intente apuntarlo a un proyecto de inicio donde se encuentra web.config / app.config



Si obtiene la ayuda para habilitar las migraciones en la Consola de Package Manager

Get-Help enable-migrations -detailed

Puede encontrar esta documentación para la opción -StartupProjectName:

-StartUpProjectName

Specifies the configuration file to use for named connection strings. If omitted, the specified project''s configuration file is used.

El documento es un poco confuso, pero significa que si usa esta opción para especificar un nombre de proyecto, las migraciones buscarán la cadena de conexión en el archivo de configuración del proyecto especificado. (El archivo de configuración puede ser web.config o app.config ).

Si está creando una aplicación web, lo más probable es que la cadena de conexión esté en su web.config , por lo que debe especificar el proyecto de la aplicación web. Si es otro tipo de proyecto, la cadena de conexión estará en un archivo app.config de una biblioteca de clases o lo que sea, y tendrás que especificar ese proyecto.

Además, se recomienda que utilice un constructor para su clase DbContext que especifique el nombre de la cadena de conexión, es decir,

public class CompanyEntities : DbContext { public CompanyEntities() :base("ConnectionStringName") { ... } .... }

De esta manera, no depende de las cadenas de conexión predeterminadas, lo que puede resultar confuso.


Si su solución tiene varios proyectos, intente configurar el Proyecto de Inicio para la solución al proyecto que contiene el archivo Web.Config o App.Config que contiene la configuración de EF.

Tuve una solución con un proyecto web y un proyecto separado (Data.Models) para mis modelos. Todo estuvo bien hasta que agregué una aplicación de consola a la solución. Tan pronto como establezca que sea el proyecto de inicio, EF Migrations fallará.

Además, si varios proyectos en la solución tienen migraciones habilitadas, siempre ejecute la base de datos de actualización en cada proyecto después de hacer una adición de migración. Mi proyecto web tenía una migración pendiente, y las migraciones fallaron extrañamente en el segundo proyecto debido a la migración pendiente en el primero.


Su proyecto de inicio contiene web.config o app.config, ya que EF usa el proyecto de inicio como fuente de la cadena de conexión