Ich versuche, EF6 Code-basierte Konfiguration mit SQLite in .NET 4.0 arbeiten. In meiner Zielapplikation wird App.config
automatisch generiert, so dass das Bearbeiten sehr schmerzhaft ist. Anfangs, wenn EF6 Installation auf meine Testanwendung SQLite durch NuGet erzeugt es die folgende Konfiguration, die funktioniert:EF6 mit SQLite in .NET 4.0 Code-basierte Konfiguration: "Kann die DbProviderFactory nicht ermitteln"
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
</DbProviderFactories>
</system.data>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
</providers>
</entityFramework>
</configuration>
auf SQL Server CE konnte ich nur den Inhalt der App.config
auf eine DbConfiguration Klasse kopieren. Ebenso habe ich versucht:
class DBConfig : DbConfiguration
{
public DBConfig() : base()
{
this.SetDefaultConnectionFactory(new LocalDbConnectionFactory("v11.0"));
this.SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance);
this.SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance);
this.SetProviderServices("System.Data.SqlClient", SqlProviderServices.Instance);
this.SetProviderServices("System.Data.SQLite.EF6", (DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices)));
}
}
Aber wenn der Kontext zu schaffen, indem die Konstruktor SQLiteConnection geben oder connection ergibt dies mir die System.NotSupportedException:
können nicht DbProviderFactory Typen für die Verbindung des Typs ‚System bestimmen. Data.SQLite.SQLiteConnection '. Stellen Sie sicher, dass der ADO.NET-Anbieter in der Anwendungskonfiguration installiert oder registriert ist.
at System.Data.Entity.Infrastructure.Net40DefaultDbProviderFactoryResolver.<>c__DisplayClass5.<GetProviderFactory>b__0(Type t)
at System.Collections.Concurrent.ConcurrentDictionary'2.GetOrAdd(TKey key, Func'2 valueFactory)
at System.Data.Entity.Infrastructure.Net40DefaultDbProviderFactoryResolver.GetProviderFactory(DbConnection connection, IEnumerable'1 dataRows)
at System.Data.Entity.Infrastructure.Net40DefaultDbProviderFactoryResolver.ResolveProviderFactory(DbConnection connection)
at System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderFactory(DbConnection connection)
at System.Data.Entity.Core.Common.DbProviderServices.GetProviderFactory(DbConnection connection)
at System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInvariantName(DbConnection connection)
at System.Data.Entity.Internal.InternalConnection.get_ProviderName()
at System.Data.Entity.Internal.LazyInternalContext.get_ProviderName()
at System.Data.Entity.Internal.DefaultModelCacheKeyFactory.Create(DbContext context)
at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
at System.Data.Entity.Internal.InternalContext.Initialize()
at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
at System.Data.Entity.Internal.Linq.InternalSet'1.Initialize()
at System.Data.Entity.Internal.Linq.InternalSet'1.get_InternalContext()
at System.Data.Entity.Internal.Linq.InternalSet'1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
at System.Data.Entity.Internal.Linq.InternalSet'1.Add(Object entity)
at System.Data.Entity.DbSet`1.Add(TEntity entity)
Ich habe versucht:
SetProviderServices("System.Data.SQLite", (DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices)));
nach this answer Zugabe.- Hinzufügen
AddDependencyResolver(new SingletonDependencyResolver<DbProviderFactory>(SQLiteProviderFactory.Instance));
und DependencyResolvers für DbProviderServices und IDbConnectionFactory und sogar versucht, sie ad DefaultResolvers setzen. - Erstellen meiner eigenen SQLiteConnectionFactory und Einstellung als Standard gemäß this answer.
Ich erinnere mich, irgendwo gelesen, dass, wenn es ein <System.Data>
Abschnitt in Machine.config
Datei ist es Verwirrung in den ProviderFactories verursachen kann. Gibt es eine codebasierte Konfiguration, die <remove invariant="" />
entspricht?
Auch die SQLiteProviderService-Klasse ist intern und der einzige Weg zu erhalten ist durch Reflexion nach this answer. Ist das Programm wirklich in der Lage, auf den Dienst zuzugreifen? Dies scheint jedoch für die meisten Menschen zu funktionieren.
Jede Hilfe oder Ideen zu versuchen und zu lösen, diese gut geschätzt!
Ein neugieriger Hinweis: Wenn ein SQLiteConnection von SQLiteProviderFactory.Instance.CreateConnection()
die DbProviderFactory Eigenschaft der Verbindung ist System.Data.SQLite.SQLiteFactory
zu schaffen, sondern mit der Arbeits App.config
Konfiguration System.Data.Entity.Core.Common.DbProviderServices.GetProviderFactory(connection)
SQLiteProviderFactory
zurückgibt. Während mit codebasierter Konfiguration es wirft.
Ändern Sie den Standard-Verbindungs Fabrik SQLite zu sein? – ErikEJ
Gibt es eine vorgefertigte Verbindungsfabrik? Ich konnte keine finden, also habe ich meine eigene nach der Antwort von einem der Links erstellt und diese als Standard festgelegt. Kein Erfolg dort. – Silvyrfir