Ho cercato di generare i modelli di Entity Framework per un database esistente.
Sto utilizzando EntityFrameworkCore.Jet
(v2.1.0 preview 5) con EntityFrameworkCore
(v2.1.2) in Visual Studio 2017. Ho usato il seguente comando all'interno della Console di Gestione pacchetti:
PM> Scaffold-DbContext -Connection "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\..\workplace\TestProject\demo.accdb;Jet OLEDB:Database Password=****;" -Provider EntityFrameworkCore.Jet -OutputDir Models -verbose
che mi ha dato questa uscita:
Using project 'TestProject'.
Using startup project 'TestProject'.
Build started...
Build succeeded.
...
Using assembly 'TestProject'.
Using startup assembly 'TestProject'.
Using application base 'C:\..\workplace\TestProject\bin\Debug'.
Using working directory 'C:\..\workplace\TestProject'.
Using root namespace 'TestProject'.
Using project directory 'C:\..\workplace\TestProject\'.
Using configuration file 'C:\..\workplace\TestProject\bin\Debug\TestProject.exe.config'.
Finding design-time services for provider 'EntityFrameworkCore.Jet'...
Using design-time services from provider 'EntityFrameworkCore.Jet'.
Finding design-time services referenced by assembly 'TestProject'.
No referenced design-time services were found.
Finding IDesignTimeServices implementations in assembly 'TestProject'...
No design-time services were found.
System.InvalidOperationException: Der 'Microsoft.ACE.OLEDB.12.0'-Provider ist nicht auf dem lokalen Computer registriert.
...
Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
Der 'Microsoft.ACE.OLEDB.12.0'-Provider ist nicht auf dem lokalen Computer registriert.
Che si traduce in
Il provider 'Microsoft.ACE.OLEDB.12.0' non è registrato sul computer locale.
All'inizio mi aspettavo che fosse così e ho fatto delle ricerche che mi hanno portato qui e ho seguito la soluzione data, ma il problema persisteva. Esaminando la cartella C:\Program Files (x86)\Common Files\microsoft shared
contiene le sottocartelle OFFICE12
, OFFICE14
e OFFICE16
che contengono ciascuno un ACEOLEDB.DLL
.
Confermato attraverso l'uso in un primo approccio del codice il fornitore è effettivamente registrato e utilizzabile! Ma se utilizzato nel Gestore pacchetti, non può essere trovato. Mi manca qualche riferimento specifico?
Poiché lo stesso identico ConnectionString funziona quando usato con CodeFirst quale potrebbe essere il problema? Oppure EntityFrameworkCore.Jet non è abilitato per il primo approccio al database?
Rivisitando questo problema, mi sono reso conto che la configurazione della compilazione era stata impostata su Any CPU
.
Ricorda che ho installato office 32bit
e il corrispondente set di driver a 32 bit (vedi questo e questo )
Mentre Code First verrà eseguito in Any CPU
Configuration, la Package-Manager-Console ha un problema con questo. Sembra che PMC stia cercando di risolvere il x64
-provider in questa configurazione.
Passando questa impostazione a x86
in Visual Studio 2017 è stato risolto il problema:
Using assembly 'TestProject'.
Using startup assembly 'TestProject'.
Using application base 'C:\..\workplace\TestProject\bin\x86\Debug'.
Using working directory 'C:\..\workplace\TestProject'.
Using root namespace 'TestProject'.
Using project directory 'C:\..\workplace\TestProject\'.
Using configuration file 'C:\..\workplace\TestProject\bin\x86\Debug\TestProject.exe.config'.
Dopo aver cambiato la configurazione di compilazione di Project / StartupProject in x86
PMC è in grado di risolvere il provider Microsoft.ACE.OleDb.12.0
e di impalcare il database con successo.