web-dev-qa-db-fra.com

Entity Framework 6 définit la chaîne de connexion dans le code

J'ai une dll qui utilise Entity Framework 6 pour effectuer certaines opérations de base de données. J'utilise une première approche de base de données . Le modèle et tout ce qui concerne Entity Framework, comme la chaîne de connexion dans App.config, ont été créés via le wizzard de Visual Studio.

J'ai donc compilé la dll et l'ai mis avec le .config correspondant dans le dossier où l'application utilisant la dll l'attend.

Tout fonctionne bien jusqu'à ce que j'arrive au point où un appel de base de données est effectué. Là je reçois l'erreur:

Impossible de trouver la chaîne de connexion pour MyDatabaseEntity

Comme je l'ai dit, la chaîne de connexion générée automatiquement se trouve dans le fichier de configuration de la DLL. Je ne peux pas modifier le fichier App.config de l'application . Mais l'application cède un objet qui contient toutes les informations nécessaires pour créer la chaîne de connexion moi-même . Je cherche donc un moyen de définir la connexion. chaîne dans le code sans s'appuyer sur un fichier de configuration . Tous les tutoriels que je trouve pour une approche de base de données utilisent cette méthode, mais . l'objet comme

MyDatabaseEntities = new MyDatabaseEntities(dbConnect);

mais ‘MyDatabaseEntities’ n’a pas de constructeur qui prend aucun paramètre

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

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

    public virtual DbSet<MyTable> MyTable { get; set; }
}
8
FNR

Que diriez-vous:

public partial class MyDatabaseEntities : DbContext
{
public MyDatabaseEntities(string connectionString)
    : base(connectionString)
{
}

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

public virtual DbSet<MyTable> MyTable { get; set; }

}

Puis initialisez votre base de données comme vous l'avez fait auparavant:

string myConnectionString = "...";
MyDatabaseEntities = new MyDatabaseEntities(myConnectionString);
14
Alexander Derck

J'ai eu le même problème. Mon Edmx et App.Config était dans un projet différent. Mon projet de démarrage était différent, avait 3 chaînes de connexion différentes, nous devons en choisir une à la volée en fonction de l'environnement. Donc, ne pouvait pas utiliser une chaîne de connexion fixe. J'ai créé une surcharge de classe partielle de Context.cs en utilisant le même espace de noms. Ce qui suit était mon Context.cs par défaut;

namespace CW.Repository.DBModel
{

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

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

Ma surcharge de classe partielle;

namespace CW.Repository.DBModel
{
    public partial class CWEntities : DbContext
    {
        public CWEntities(string ConnectionString)
            : base(ConnectionString)
        {
        }        
    }
}

Enfin, comme mes chaînes de connexion n’étaient pas pour EF, je les ai converties en chaîne de connexion EF.

public static string GetEntityConnectionString(string connectionString)
    {
        var entityBuilder = new EntityConnectionStringBuilder();

        // WARNING
        // Check app config and set the appropriate DBModel
        entityBuilder.Provider = "System.Data.SqlClient";
        entityBuilder.ProviderConnectionString = connectionString + ";MultipleActiveResultSets=True;App=EntityFramework;";
        entityBuilder.Metadata = @"res://*/DBModel.CWDB.csdl|res://*/DBModel.CWDB.ssdl|res://*/DBModel.CWDB.msl";

        return entityBuilder.ToString();
    }

Enfin, l'appelant 

var Entity = new CWEntities(CWUtilities.GetEntityConnectionString(ConnectionString));
4
Mahib

J'ai eu cette solution en utilisant le code ci-dessous, je peux coder en dur la chaîne de connexion en utilisant le code C # sans utiliser le fichier de configuration. 

 public class SingleConnection
    {
        private SingleConnection() { }
        private static SingleConnection _ConsString = null;
        private String _String = null;

        public static string ConString
        {
            get
            {
                if (_ConsString == null)
                {
                    _ConsString = new SingleConnection { _String = SingleConnection.Connect() };
                    return _ConsString._String;
                }
                else
                    return _ConsString._String;
            }
        }

        public static string Connect()
        {
            //Build an SQL connection string
            SqlConnectionStringBuilder sqlString = new SqlConnectionStringBuilder()
            {
                DataSource = "SIPL35\\SQL2016".ToString(), // Server name
                InitialCatalog = "Join8ShopDB",  //Database
                UserID = "Sa",         //Username
                Password = "Sa123!@#",  //Password
            };
            //Build an Entity Framework connection string
            EntityConnectionStringBuilder entityString = new EntityConnectionStringBuilder()
            {
                Provider = "System.Data.SqlClient",
                Metadata = "res://*/ShopModel.csdl|res://*/ShopModel.ssdl|res://*/ShopModel.msl",
                ProviderConnectionString = @"data source=SIPL35\SQL2016;initial catalog=Join8ShopDB2;user id=Sa;password=Sa123!@#;"// sqlString.ToString()
            };
            return entityString.ConnectionString;
        }

et en utilisant DbContext en utilisant comme ceci:

Join8ShopDBEntities dbContext = new Join8ShopDBEntities(SingleConnection.ConString);
3
Dev-Systematix

Merci beaucoup . J'ai peu changé pour Code First EF6.

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.Entity.Core.EntityClient;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Data
{
    public class SingleConnection
    {
        private SingleConnection() { }
        private static SingleConnection _ConsString = null;
        private String _String = null;

        public static string ConString
        {
            get
            {
                if (_ConsString == null)
                {
                    _ConsString = new SingleConnection { _String = SingleConnection.Connect() };
                    return _ConsString._String;
                }
                else
                    return _ConsString._String;
            }
        }

        public static string Connect()
        {
            string conString = ConfigurationManager.ConnectionStrings["YourConnectionStringsName"].ConnectionString;

            if (conString.ToLower().StartsWith("metadata="))
            {
                System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder efBuilder = new System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder(conString);
                conString = efBuilder.ProviderConnectionString;
            }

            SqlConnectionStringBuilder cns = new SqlConnectionStringBuilder(conString);
            string dataSource = cns.DataSource;


            SqlConnectionStringBuilder sqlString = new SqlConnectionStringBuilder()
            {
                DataSource = cns.DataSource, // Server name
                InitialCatalog = cns.InitialCatalog,  //Database
                UserID = cns.UserID,         //Username
                Password = cns.Password,  //Password,
                MultipleActiveResultSets = true,
                ApplicationName = "EntityFramework",

            };
            //Build an Entity Framework connection string
            EntityConnectionStringBuilder entityString = new EntityConnectionStringBuilder()
            {
                Provider = "System.Data.SqlClient",
                Metadata = "res://*",
                ProviderConnectionString = sqlString.ToString()
            };
            return entityString.ConnectionString;
        }
    }
}
0
Cetin Sahin