web-dev-qa-db-fra.com

Transmettre la chaîne de connexion à DbContext, le premier code

Comment passer une chaîne de connexion au DbContext code-first de l'entité-structure? La génération de ma base de données fonctionne correctement lorsque DbContext et la chaîne de connexion dans web.config se trouvent dans le même projet et portent le même nom. Mais maintenant, je dois déplacer DbContext vers un autre projet afin que je teste le passage d'une chaîne de connexion à celui-ci comme suit:

Modèle et contexte

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; }
}

Action

    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 je définis un point d'arrêt dans l'action et que j'analyse le db, la chaîne de connexion est présente, mais elle ne crée ni ne trouve la base de données ni quoi que ce soit.

Une erreur liée au réseau ou à une instance spécifique s'est produite lors de l'établissement d'une connexion à SQL Server. Le serveur est introuvable ou inaccessible. Vérifiez que le nom de l'instance est correct et que SQL Server est configuré pour autoriser les connexions à distance. (fournisseur: fournisseur de canaux nommés, erreur: 40 - Impossible d'ouvrir une connexion à SQL Server)

83
Shawn Mclean

Après avoir lu la documentation, je dois passer le nom de la chaîne de connexion:

var db = new NerdDinners("NerdDinnerDb");
56
Shawn Mclean

Un peu tard pour le jeu ici, mais une autre option est:

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
    {
        this.Database.Connection.ConnectionString = connString;
    }
    public DbSet<Dinner> Dinners { get; set; }
}
81
Bitfiddler

Je pensais que j'ajouterais ce bit aux personnes qui recherchent "Comment passer une chaîne de connexion à un DbContext": Vous pouvez construire une chaîne de connexion pour votre magasin de données sous-jacent et transmettre la chaîne de connexion complète au constructeur de votre type dérivé de DbContext .

(Réutilisation du code de @Lol Coder) Modèle et contexte

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; }
}

Ensuite, supposons que vous construisiez une chaîne de connexion Sql à l’aide de SqlConnectioStringBuilder comme ceci:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString());

Où la méthode GetConnectionString construit la chaîne de connexion appropriée et SqlConnectionStringBuilder garantit que la chaîne de connexion est correcte du point de vue de la syntaxe; vous pouvez alors instancier votre conetxt db comme ceci:

var myContext = new NerdDinners(builder.ToString());
36
Sudhanshu Mishra

Dans votre DbContext, créez un constructeur par défaut pour votre DbContext et héritez de la base de la manière suivante:

    public myDbContext()
        : base("MyConnectionString")  // connectionstring name define in your web.config
    {
    }
27
Kinh Pham

J'ai un petit exemple de solution pour ce problème.

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
 }

frmMyForm.cs

 MyDBContext db = new MyDBContext(DBConnectionType.MainConnection);
                               //or
//MyDBContext db = new MyDBContext(DBConnectionType.BackupConnection);
2
Durgesh Pandey

Si vous construisez la chaîne de connexion dans l'application, utilisez votre commande de connString. Si vous utilisez une chaîne de connexion dans la configuration Web. Ensuite, vous utilisez le "nom" de cette chaîne.

2
MKunstman

Vérifiez la syntaxe de votre chaîne de connexion dans le fichier web.config. Cela devrait être quelque chose comme ConnectionString="Data Source=C:\DataDictionary\NerdDinner.sdf"

1
kmerkle

Lors de l'utilisation d'un modèle EF, j'ai une chaîne de connexion dans chaque projet qui utilise le modèle EF. Par exemple, j'ai un modèle EF EDMX dans une bibliothèque de classes séparée. J'ai une chaîne de connexion dans mon projet web (mvc) pour pouvoir accéder à la base de données EF.

J'ai également un autre projet de test unitaire pour tester les référentiels. Pour que les référentiels puissent accéder à la base de données EF, le fichier app.config du projet de test contient la même chaîne de connexion.

Les connexions à la base de données doivent être configurées et non codées, IMO.

1
danludwig

Je ne vois rien de mal avec votre code, j'utilise SqlExpress et tout fonctionne correctement lorsque j'utilise une chaîne de connexion dans le constructeur.

Vous avez créé un dossier App_Data dans votre projet, n'est-ce pas?

0
Lee Smith