Pase la cadena de conexión al primer código DbContext


¿Cómo paso una cadena de conexión a DbContext de entity framework primero en código? Mi generación de base de datos funciona correctamente cuando tanto DbContext como la cadena de conexión en web.config está en el mismo proyecto y tiene el mismo nombre. Pero ahora necesito mover el DbContext a otro proyecto, así que estoy probando pasándole una cadena de conexión de la siguiente manera:

Modelo Y Contexto

public class Dinner
{
    public int DinnerId { get; set; }
    public string Title { get; set; }
}

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
        : base(connString)
    {
    }
    public DbSet<Dinner> Dinners { get; set; }
}

Acción

    public ActionResult Index()
    {
        var db = new NerdDinners(ConfigurationManager.ConnectionStrings["NerdDinnerDb"].ConnectionString);

        var dinners = (from d in db.Dinners
                      select d).ToList();
        return View(dinners);
    }

Web.Config

<connectionStrings>
  <add name="NerdDinnerDb" connectionString="Data Source=|DataDirectory|NerdDinners.sdf" providerName="System.Data.SqlServerCe.4.0"/>    
</connectionStrings>

Si establezco una punto de interrupción en la acción an analiza el db, la cadena de conexión está allí, pero no crea ni encuentra la base de datos ni nada.

Se produjo un error relacionado con la red o específico de la instancia al establecer una conexión con SQL Server. El servidor no fue encontrado o no fue accesible. Compruebe que el nombre de la instancia es correcto y que SQL Server está configurado para permitir conexiones remotas. (provider: Named Pipes Provider, error: 40-No se pudo abrir una conexión a SQL Servidor)

Author: abatishchev, 2011-01-26

9 answers

Un poco tarde para el juego aquí, pero otra opción es:

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
    {
        this.Database.Connection.ConnectionString = connString;
    }
    public DbSet<Dinner> Dinners { get; set; }
}
 71
Author: Bitfiddler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-14 20:15:59

Después de leer los documentos, tengo que pasar el nombre de la cadena de conexión en su lugar:

var db = new NerdDinners("NerdDinnerDb");
 55
Author: Shawn Mclean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-26 16:19:37

Pensé en agregar este bit para las personas que vienen buscando "Cómo pasar una cadena de conexión a un DbContext": Puede construir una cadena de conexión para su almacén de datos subyacente y pasar toda la cadena de conexión al constructor de su tipo derivado de DbContext.

(Reutilizando el código de @Lol Coder) Modelo y contexto

public class Dinner
{
    public int DinnerId { get; set; }
    public string Title { get; set; }
}

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
        : base(connString)
    {
    }
    public DbSet<Dinner> Dinners { get; set; }
}

Entonces, supongamos que construye una cadena de conexión Sql usando SqlConnectioStringBuilder de la siguiente manera:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString());

Donde el El método GetConnectionString construye la cadena de conexión apropiada y el SqlConnectionStringBuilder asegura que la cadena de conexión sea sintácticamente correcta; entonces puede instanciar su db conetxt de la siguiente manera:

var myContext = new NerdDinners(builder.ToString());
 36
Author: dotnetguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-03 09:29:50

En su DbContext, cree un constructor predeterminado para su DbContext y herede la base de la siguiente manera:

    public myDbContext()
        : base("MyConnectionString")  // connectionstring name define in your web.config
    {
    }
 24
Author: Kinh Pham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-09 04:50:32

Si está construyendo la cadena de conexión dentro de la aplicación, entonces usaría su comando de connString. Si está utilizando una cadena de conexión en la configuración web. Luego usa el "nombre" de esa cadena.

 2
Author: MKunstman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-10 16:53:35

Compruebe la sintaxis de su cadena de conexión en la web.config. Debería ser algo como ConnectionString="Data Source=C:\DataDictionary\NerdDinner.sdf"

 1
Author: kmerkle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-26 13:38:19

Cuando uso un modelo EF, tengo una cadena de conexión en cada proyecto que consume el modelo EF. Por ejemplo, tengo un modelo EF EDMX en una biblioteca de clases separada. Tengo una cadena de conexión en mi proyecto web (mvc) para que pueda acceder a EF db.

También tengo otro proyecto de prueba unitaria para probar los repositorios. Para que los repositorios accedan a EF db, la aplicación del proyecto de prueba.el archivo de configuración tiene la misma cadena de conexión.

Las conexiones DB deben ser configurado, no codificado, IMO.

 1
Author: danludwig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-26 13:38:35

No puedo ver nada malo con su código, uso SqlExpress y funciona bien cuando uso una cadena de conexión en el constructor.

Ha creado una carpeta App_Data en su proyecto, ¿no es así?

 0
Author: Dubious,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-26 14:35:57

Tengo un pequeño ejemplo de solución para ese problema.

MyDbContext.cs

 public MyDBContext(DBConnectionType ConnectionType) //: base("ConnMain")
  {
      if(ConnectionType==DBConnectionType.MainConnection)
       {
         this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnMain"].ConnectionString;
       }
      else if(ConnectionType==DBConnectionType.BackupConnection)
       {
         this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnBackup"].ConnectionString;
       }
  }

MyClass.cs

public enum DBConnectionType
 {
    MainConnection=0,
    BackupConnection=1
 }

Frmyform.cs

 MyDBContext db = new MyDBContext(DBConnectionType.MainConnection);
                               //or
//MyDBContext db = new MyDBContext(DBConnectionType.BackupConnection);
 0
Author: Durgesh Pandey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-24 16:08:33