Cómo nombrar explícitamente la base de datos cuando se usa migraciones de Entity Framework 4.3

StackOverflow https://stackoverflow.com/questions/9327409

  •  27-10-2019
  •  | 
  •  

Pregunta

Recientemente comencé a usar migraciones de marco de entidad y noté que el nombre de la base de datos no me está logrando cuando ejecuto el Update-Database dominio.

Mi conexión de conexión es:

<connectionStrings>
<add name="DataContext" connectionString="Server=.\SQLEXPRESS;Initial Catalog=TestDB;Trusted_Connection=Yes;" providerName="System.Data.SqlClient" />
</connectionStrings>

La primera vez que corro Actualizar base de datos Mi base de datos se crea con el nombre correcto Testdb. Sin embargo, tan pronto como realice un cambio en una de mis entidades, no se actualizará más para mí a menos que agregue un nombre de proyecto de inicio (estoy usando una solución de proyecto múltiple):

Update-Database -StartUpProjectName "TestDB.Data"

Esto hace otra nueva base de datos que las migraciones siempre continuarán utilizando. No me importa tener que poner en el StartupprojectName Comando, pero ¿hay alguna forma de anular el nombre predeterminado de la base de datos que esto produce? Siempre crea la base de datos como

TestDB.Data.DataContext

¿Hay alguna manera de asegurarse de que la base de datos creada al pasar el nombre de inicio se llame solo? Testdb ¿O es esto una limitación de usar la configuración StartupProjectName?

Como nota, creo que la razón por la que necesito especificar el STARTUPPROJECTNAME es que tengo una configuración de proyecto multicapa. El archivo de configuración de migraciones está en mi proyecto de 'datos', las entidades/modelos están en mi proyecto de 'dominio', etc. Tampoco tengo ninguna opción de inicialización en mi archivo global.asax.cs como habría usado anteriormente en Código primero EF 4.2. Entonces, en mi proyecto, solo tengo un DataContext en mi proyecto de datos y la configuración de migraciones en ese proyecto también.

EDITAR:

Como originalmente configuré esta pregunta, me topé con la forma 'correcta' de nombrar una base de datos en una solución multiproject. Si bien la respuesta a continuación funcionará, significa que está duplicando su web.config en otra área, que no es una solución ideal. En su lugar, puede poner el nombre en su DBContext haciendo algo como esto (DataContext es el nombre que usé en mi proyecto):

public class DataContext : DbContext
{
    public DataContext() : base("DatabaseNameHere")
    { }

    public DbSet<Table1> Table1 { get; set; }
    public DbSet<Table2> Table2 { get; set; }

    public virtual void Commit()
    {
        base.SaveChanges();
    }
}

Gracias,

Rico

¿Fue útil?

Solución

Al hacer update-database Debe especificar el proyecto que contiene las migraciones. Asegúrese de tener un app.config Archivo en ese proyecto que contiene la cadena de conexión correcta.

Al dividir una aplicación en varios proyectos, la cadena de conexión utilizada al ejecutar la aplicación es la que se inicia el proyecto. Al migrar, la cadena de conexión utilizada es la que contiene las migraciones.

Cuando hice una configuración similar tuve que agregar la cadena de conexión en dos lugares. Un poco incómodo, pero funciona.

Otros consejos

Puede evitar administrarlo en App.Config ofreciéndolo como parámetro:

Update-Database -Verbose 
 -ConnectionString "CONNECTIONSTRING" 
 -ConnectionProviderName "System.Data.SqlClient"
 -StartupProjectName WEBSITE_PROJECT -ProjectName MIGRATION_PROJECT

Piegio fácil, si te encanta escribir sin parar.

Puede tener su cadena de conexión almacenada en Web.Config en el proyecto de su sitio web y los archivos DBContext and Migration en otro proyecto y aún así compartir la misma cadena de conexión. Sin embargo, debe asegurarse de que, así como configurar el proyecto de datos (o cualquier proyecto que tenga el DBContext, etc. ¡También debe asegurarse de que su sitio web esté configurado en el proyecto de inicio predeterminado!

No puedo ver esto documentado en ningún lado, pero un frenético 24 horas de no poder descubrir por qué mis migraciones, donde de repente se aplicaban a un DB sqlexpress, me llevaron a esta conclusión.

Lo intenté con el último EF5 de Nuget.

Sin embargo Update-Database no lee el App.config Del proyecto que contiene las migraciones (al igual que la respuesta hace 1 año) pero solo se leerá *.config de Proyecto de inicio. Es genial pero descubro cómo Add-Migration y Update-Database Encuentra una cadena de conexión adecuada aquí:

  1. Intenta obtener la cadena de conexión "DefaultConnection" primero
  2. Luego está tratando de obtener el nombre de la cadena de conexión basado en el nombre de la clase de contexto. Por ejemplo, tengo el MyContext clase derivada de DbContext Entonces puedo usar el nombre de la cadena de conexión "MyContext". Útil cuando tengo varias conexiones DB.
  3. Si no se encuentran ambos nombres de cadenas de conexión anteriores, fallará y no mostrará una cadena de conexión de "Control de CONSEJO" a menos que suministre el -ConnectionStringName parámetro. Ver get-help Update-Database Para ver la página de ayuda en la consola del Administrador de paquetes.

No hay un intento de reintento o alternativo, por lo que si la "Consejo de default" contiene una cadena de conexión incorrecta, simplemente mostrará un error.

Si existen tanto el nombre predeterminado como el nombre de contexto en las cadenas de conexión, la contratación predeterminada tendrá prioridad.

Preferiría que el #2 se convierta en el primer intento porque el nombre es más específico, pero los pasos anteriores son lo que hacen las migraciones EF5 al tratar de conectarse a la DB.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top