Ajouter un DbProviderFactory sans App.Config

ado.net dbproviderfactories entity-framework sqlite

Question

J'utilise DbProviderFactories dans ma couche de données (basée sur Entity Framework) et j'utilise SQLite pour ma base de données, mais je n'ai pas besoin d'un App.Config pour avoir le code suivant:

<configuration>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite"/>
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    </DbProviderFactories>
  </system.data>
</configuration>

Au lieu de cela, j'aimerais que ma couche de données le mette par programme. Quelqu'un sait-il comment faire cela?

MODIFIER:

La raison en est que j'utilise un conteneur IoC pour sélectionner la couche de données et que certaines de mes couches de données n'ont pas besoin des valeurs de App.Config ou qu'elles sont liées à la couche de données.

Réponse acceptée

Ce qui suit va probablement causer des taches solaires et renverser la civilisation occidentale. Cela peut même provoquer un débat sur la programmation de bandes de conduits (arrête!), Mais cela fonctionne

try
{
    var dataSet = ConfigurationManager.GetSection("system.data") as System.Data.DataSet;
    dataSet.Tables[0].Rows.Add("SQLite Data Provider"
    , ".Net Framework Data Provider for SQLite"
    , "System.Data.SQLite"
    , "System.Data.SQLite.SQLiteFactory, System.Data.SQLite");
}
catch (System.Data.ConstraintException) { }

Réponse populaire

JoshRivers ci-dessus a posté une solution pour SQLite. Cela peut en fait être utilisé pour d’autres adaptateurs. J’ai réussi à le faire fonctionner pour MySQL en utilisant son exemple. Je l'ai emballé dans quelque chose d'un peu plus générique. Cela devrait être exécuté une fois l'application démarrée et concerne le connecteur .NET version 6.6.5.0 (mais j'imagine que c'est également bon pour les autres versions.)

string dataProvider = @"MySql.Data.MySqlClient";
string dataProviderDescription = @".Net Framework Data Provider for MySQL";
string dataProviderName = @"MySQL Data Provider";
string dataProviderType = @"MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.6.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d";

bool addProvider = true;
var dataSet = ConfigurationManager.GetSection("system.data") as DataSet;
foreach (DataRow row in dataSet.Tables[0].Rows)
{
    if ((row["InvariantName"] as string) == dataProvider)
    {
        // it is already in the config, no need to add.
        addProvider = false;
        break;
    }
}

if (addProvider)
    dataSet.Tables[0].Rows.Add(dataProviderName, dataProviderDescription, dataProvider, dataProviderType);


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow