Ajouter un DbProviderFactory sans une Application.Config
Je suis en utilisant DbProviderFactories dans ma couche de données (basé sur Entity Framework) et j'utilise SQLite pour ma base de données, mais je n'ai pas à avoir une 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, je voudrais avoir mes données de la couche de mettre cela dans la programmation. Quelqu'un connait un moyen de faire cela?
EDIT:
La raison pour cela est que je suis en utilisant un conteneur IoC pour choisir la couche de données et de certains de mes couches de données n'avez pas besoin de l'Application.Config valeurs, ou de leur dur liée à la couche de données.
- Pourquoi vous n'avez pas une application.config. Si vous n'avez pas (peut-être vous êtes une bibliothèque de classe), alors l'application appelante n'. Mettre la configuration.
- Vous vous demandez si Jason jamais trouvé une réponse à cette... j'ai une HTA qui est l'appel de notre .Net assemblées comme des objets COM. Donc, il n'y a pas d'application.config. Nous sommes à l'aide de SQL CE et nous sommes confrontés à la même question.
- Pour moi, j'ai essayé de faire plusieurs exe utiliser le même fichier de configuration. EntityFramework ne semblent pas être en honorant
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Shared\app.config");
d'Où l'utilité de cette question.
Vous devez vous connecter pour publier un commentaire.
De ce qui suit va probablement causer des taches solaires et de renverser la civilisation occidentale. Il peut même provoquer un débat sur la Bande de Conduit de Programmation (faire arrêter!), mais il fonctionne (pour l'instant)
JoshRivers ci-dessus posté une solution pour SQLite. Cela peut en effet être utilisé pour d'autres cartes comme le bien - j'ai été capable de le faire travailler pour MySQL à l'aide de son exemple. J'ai enroulé dans quelque chose d'un peu plus générique. Ce doit être exécuté une fois que le démarrage de l'application et de l'est de l' .NET version connecteur 6.6.5.0 (mais j'imagine que c'est bon pour les autres versions.)
RÉPONSE TARDIVE:
Vous pouvez toujours obtenir directement une usine comme ceci:
Ou de l'utilisation de votre conteneur IoC pour résoudre le
DbProviderFactory
, par exemple:Je préfère pas d'utiliser le
DbProviderFactories.GetFactory
en raison de sa limitation de exigeant un fichier de configuration (ou un hack comme dans @JoshRiver réponse).Tous
DbProviderFactories.GetFactory
n'est, il regarde le inscrit assemblée nom qualifié du type d'usine en utilisant le nom du fournisseur, puis il obtient la valeur de la statiqueInstance
de la propriété à l'aide de la réflexion.Si vous ne souhaitez pas utiliser la configuration, l'une des méthodes ci-dessus peut être plus pratique en fonction de votre cas d'utilisation.
Mise à jour pour EF 6.0+
Vous pouvez ajouter un
DbProviderFactory
par l'enregistrement d'unIDbDependencyResolver
et de résolution pour le typeDbProviderFactory
. Un exemple de ceci est ci-dessous:vous pourriez avoir à résoudre d'autres types de fonction de ce type de raisons, vous avez besoin de faire et comment votre projet d'installation. Fondamentalement, il suffit de commencer avec le code ci-dessus et continuer à déboguer jusqu'à ce que vous avez déterminé que tous les services dont vous avez besoin pour résoudre de vos besoins spécifiques.
Vous pouvez en lire plus à propos de EF de la résolution des dépendances sur les liens ci-dessous:
En outre, vous pouvez faire cette configuration en remplaçant
DbConfiguration
comme décrit dans le premier lien ci-dessus.Choisissant la DB fournisseur d'usine par programmation assez bien l'emporte sur l'objectif. Vous pourriez aussi bien utiliser les classes spécifiques à SQLite au lieu de toutes ces interfaces, non?
Dans .NET de Base 2.1 et version ultérieure, vous pouvez utiliser
DbProviderFactories.RegisterFactory
de programmation pour enregistrer unDbProviderFactory
.voir l'extrait de code suivant
vous avez besoin pour passer le ProviderName que dans votre cas, est "le Système de.Les données.SQLite".
vous n'avez pas besoin de créer l'application section de configuration. Cette section est créée par SQLite dans la machine.la configuration après l'SQLite.net fournisseur est installé.
le but de l'appconfig section est de vous aider à obtenir la liste de configuration .fournisseurs nets lorsque vous appelez la commande suivante:
public GetProvidersList()
{
DataTable table= DbProviderFactories.GetFactoryClasses();
}
Même Plus Tard, La Réponse
L'obtenir à l'aide de configuration comme ci-dessus. J'ai trouvé que cela semble exiger que le fournisseur de l'assemblée pour être quelque part que le programme en cours d'exécution peut le trouver.
Une autre méthode qui obtient le champ d'Instance directement à partir de l'assemblée. Il fonctionne même lorsque la DLL est quelque part d'autre sur le système.