2014-06-16 2 views
11

J'utilise EF6 dans une bibliothèque de classes (première base de données)Passer la chaîne de connexion à Entity Framework 6

Quand je suivais l'assistant et ajouté mes tableaux je choisi de ne pas stocker la chaîne de connexions dans le app.config et J'enverrais la chaîne de connexions.

Je ne l'ai pas fait auparavant. Normalement, je choisis de mettre la chaîne de connexion dans le fichier app.config.

Je suis maintenant complètement perplexe comment j'appelle réellement une fonction et passe la chaîne de connexion à elle.

Ci-dessous sont ce que j'espère sont des extraits de code pertinents de ma solution.

Dans le app.config - EF automatiquement ajouté ceci:

<connectionStrings> 
<add name="cerviondemoEntities" connectionString="metadata=res://*/DatabaseModel.cervionEDM.csdl|res://*/DatabaseModel.cervionEDM.ssdl|res://*/DatabaseModel.cervionEDM.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=DEVBOX;initial catalog=cerviondemo;user id=sa;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
</connectionStrings> 

Mon généré automatiquement classe de contexte ressemble à ceci:

//------------------------------------------------------------------------------ 
// <auto-generated> 
//  This code was generated from a template. 
// 
//  Manual changes to this file may cause unexpected behavior in your application. 
//  Manual changes to this file will be overwritten if the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

namespace CervionFunctions.DatabaseModel 
{ 
using System; 
using System.Data.Entity; 
using System.Data.Entity.Infrastructure; 

public partial class cerviondemoEntities : DbContext 
{ 
    public cerviondemoEntities() 
     : base("name=cerviondemoEntities") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     throw new UnintentionalCodeFirstException(); 
    } 

    public virtual DbSet<Customer> Customers { get; set; } 
    public virtual DbSet<Ticket> Tickets { get; set; } 
} 
} 

En fin de compte, je suis en train d'appeler la fonction de test suivant:

public static List<Customer> customersToUpdate() 
    { 
     cerviondemoEntities db; 

     using (db = new DatabaseModel.cerviondemoEntities()) 
     { 
      var result = from customers in db.Customers 
         select customers; 

      return result.ToList(); 
     } 
    } 

Je n'arrive pas à savoir comment envoyer la chaîne de connexion à cette fonction :(

Toute aide serait grandement appréciée!

Répondre

28

Par convention, Entity Framework prend la chaîne de connexion qui a le même nom que le contexte. Par exemple:

public cerviondemoEntities() 
    : base("name=cerviondemoEntities") 
{ 
} 

La classe DbContext a un constructeur qui prend une chaîne de connexion. Vous pouvez ajouter un autre constructeur qui prend une chaîne de connexion en tant que paramètre et la transmettre au constructeur de base. Assurez-vous de créer une classe partielle afin que votre constructeur ajouté ne soit pas écrasé.

Exemple ConnectionString:

<connectionStrings> 
    <add name="cerviondemoEntities" connectionString="data source=server\database;initial catalog=catalog;persist security info=True;user id=user;password=password;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /> 
</connectionStrings> 
+3

Alternativement, vous pouvez l'ajouter au fichier .tt au lieu de créer un autre fichier et en utilisant « partielle » – Daniel

+0

Merci ne fonctionne pas avec v. 6.1.3 Pourriez-vous fournir ce qui est nécessaire dans un fichier app.config pour que cela fonctionne? Fournissez également un exemple de chaîne de connexion qui fait fonctionner votre réponse. –

+0

J'ai ajouté un exemple de chaîne de connexion. –

3

Vous devez présenter un autre constructeur dans votre contexte qui attend un argument string connectionString et faire appel base(string nameOrConnectionString):

public cerviondemoEntities(string connectionString) : base(connectionString) 
{ 
} 
2

J'ai eu ce problème aussi bien et utilisé la méthode de Daniel dans les commentaires.

Vous pouvez l'ajouter au fichier .tt au lieu de créer un autre fichier et en utilisant 'partielle' - Daniel K 9 décembre '16 à 19:16

Mise à jour * .Context. tt fichier

, remplacez les lignes ...

public <#=code.Escape(container)#>() 
    : base("name=<#=container.Name#>") 
{ 

à ce qui suit ...

public <#=code.Escape(container)#>() 
    : this("name=<#=container.Name#>") 
{ 
} 

public <#=code.Escape(container)#>(String nameOrConnectionString) 
    : base(nameOrConnectionString) 
{ 

J'espère que cela aide.

1

J'ai utilisé la chaîne de connexion comme celui-ci, la chaîne de connexion de l'entité au lieu de chaîne de connexion normale

SqlConnectionStringBuilder sqlString = new SqlConnectionStringBuilder() 
     { 
    DataSource = "SOURAV-PC", // Server name 
    InitialCatalog = "efDB", //Database 
      UserID = "sourav",   //Username 
      Password = "mypassword", //Password 
     }; 
     //Build an Entity Framework connection string 

     EntityConnectionStringBuilder entityString = new EntityConnectionStringBuilder() 
     { 
      Provider = "System.Data.SqlClient", 
      Metadata = "res://*/testModel.csdl|res://*/testModel.ssdl|res://*/testModel.msl", 
      ProviderConnectionString = sqlString.ToString() 
     }; 
     return entityString.ConnectionString; 
    } 
Questions connexes