J'ai 2 sites Web, l'un est un sous-répertoire d'un autre mais est une application ex:/root &/root/Services
Ils utilisent tous les deux Entity Framework 6.x mais le site Web enfant lance l'initialiseur de type pour System.Data.Entity.Internal.AppConfig 'a levé une exception car il semble voir de nombreuses entrées pour le même Fournisseur de base de données EF à cause du web.config imbriqué
Existe-t-il un moyen d'effacer la collection des fournisseurs afin que je n'obtienne pas cette erreur? J'ai essayé d'en mettre sans aucun effet.
Si je commente la section des fournisseurs, cela fonctionne
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
Mais je ne veux pas le faire parce que tous les environnements n'auront pas de sites Web imbriqués. et NuGet a tendance à le remettre en place. Puis-je ajuster cela par programme?
Voici l'exception complète et la trace de la pile
System.TypeInitializationException was unhandled by user code
HResult=-2146233036
Message=**The type initializer for 'System.Data.Entity.Internal.AppConfig' threw an exception.**
Source=EntityFramework
TypeName=System.Data.Entity.Internal.AppConfig
StackTrace:
at System.Data.Entity.Internal.AppConfig.get_DefaultInstance()
at System.Data.Entity.Internal.LazyInternalConnection..ctor(String nameOrConnectionString)
at System.Data.Entity.DbContext..ctor(String nameOrConnectionString)
at co.Repository.Data.coContext..ctor() in coModel.Context.Generated.cs:line 23
at co.Repository.RepositoryBase`1.SingleOrDefault(Expression`1 predicate) in co.Repository\RepositoryBase.cs:line 13
at UserFactory.GetOneByUserName(String siteCode, String userName) in UserFactory.cs:line 151
at UserService.GetOneByUserName(String siteCode, String userName) in UserService.cs:line 59
at SyncInvokeGetOneByUserName(Object , Object[] , Object[] )
at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
InnerException: System.Configuration.ConfigurationErrorsException
HResult=-2146232062
Message=An error occurred creating the configuration section handler for entityFramework: **The provider for invariant name 'System.Data.SqlClient' is specified multiple times in the application configuration. The invariant name must be unique for each configured provider.** (web.config line 339)
Source=System.Configuration
BareMessage=An error occurred creating the configuration section handler for entityFramework: The provider for invariant name 'System.Data.SqlClient' is specified multiple times in the application configuration. The invariant name must be unique for each configured provider.
Filename=web.config
Line=339
StackTrace:
at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult)
at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
at System.Configuration.ConfigurationManager.GetSection(String sectionName)
at System.Data.Entity.Internal.AppConfig..ctor()
at System.Data.Entity.Internal.AppConfig..cctor()
InnerException: System.InvalidOperationException
HResult=-2146233079
Message=The provider for invariant name 'System.Data.SqlClient' is specified multiple times in the application configuration. The invariant name must be unique for each configured provider.
Source=EntityFramework
StackTrace:
at System.Data.Entity.Internal.ConfigFile.ProviderCollection.BaseAdd(ConfigurationElement element)
at System.Configuration.ConfigurationElementCollection.OnDeserializeUnrecognizedElement(String elementName, XmlReader reader)
at System.Configuration.ConfigurationElement.DeserializeElement(XmlReader reader, Boolean serializeCollectionKey)
at System.Configuration.ConfigurationElement.DeserializeElement(XmlReader reader, Boolean serializeCollectionKey)
at System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.CreateSectionImpl(RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader)
at System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.CreateSectionWithRestrictedPermissions(RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader)
at System.Configuration.RuntimeConfigurationRecord.CreateSection(Boolean inputIsTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader)
at System.Configuration.BaseConfigurationRecord.CallCreateSection(Boolean inputIsTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader, String filename, Int32 line)
InnerException:
Dans EF6, vous pouvez utiliser la configuration de la base de code - jetez un œil à l'article this pour plus de détails.
[~ # ~] modifier [~ # ~]
J'ai vérifié un changement au code EF6 où les doublons exacts sont ignorés. Cela devrait résoudre votre problème. Notez que cela ne correspondait pas à la version 6.0.2 et devrait être inclus dans la prochaine version après 6.0.2.
J'ai eu un problème avec EF 4.3.1 avec un site imbriqué.
Les deux sites utilisaient la même bibliothèque et les mêmes chaînes de connexion ... l'erreur était due à des doublons apparents dans le
<connectionStrings>
Il était probablement en train de charger les chaînes de connexion à partir du site parent, puis de ne pas charger les chaînes du sous-site.
Dans votre sous-site, ajoutez:
<connectionStrings>
<clear/>
...your normal connection strings
</connectionStrings>
J'ai eu le même problème.
J'ai résolu cette erreur en mettant simplement à jour le numéro de version à partir de:
Version = 5.0.0.0
à:
Version = 6.0.0.0
Exemple:
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089" requirePermission="false" />