Fügen Sie eine DbProviderFactory ohne App.Config hinzu

ado.net dbproviderfactories entity-framework sqlite

Frage

Ich verwende DbProviderFactories in meiner Datenschicht (basierend auf Entity Framework) und verwende SQLite für meine Datenbank. Ich brauche jedoch keine App.Config, um folgenden Code zu erhalten:

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

Stattdessen möchte ich, dass meine Datenschicht programmgesteuert eingefügt wird. Weiß jemand einen Weg, dies zu tun?

BEARBEITEN:

Der Grund dafür ist, dass ich einen IoC-Container verwende, um die Datenschicht auszuwählen, und einige meiner Datenschichten benötigen die App.Config-Werte nicht oder sind nicht fest mit der Datenschicht verbunden.

Akzeptierte Antwort

Das Folgende wird wahrscheinlich Sonnenflecken verursachen und die westliche Zivilisation stürzen. Es kann sogar eine Debatte über die Duct Tape-Programmierung auslösen (lass es aufhören!), Aber es funktioniert (vorerst)

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) { }

Beliebte Antwort

JoshRivers hat eine Lösung für SQLite veröffentlicht. Dies kann in der Tat auch für andere Adapter verwendet werden - ich konnte es mit seinem Beispiel für MySQL zum Laufen bringen. Ich habe das in etwas generischeres eingepackt. Dies sollte ausgeführt werden, sobald die Anwendung gestartet wird, und gilt für die .NET-Connector-Version 6.6.5.0.

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum