Mi piacerebbe usare SQLite con Entity Framework Core. Sto seguendo questo tutorial ufficiale:
Dice di modificare il progetto.json in questo modo:
{
"version": "1.0.0-*",
"buildOptions": {
"debugType": "portable",
"emitEntryPoint": true
},
"dependencies": {
"Microsoft.EntityFrameworkCore.Sqlite": "1.1.0",
"Microsoft.EntityFrameworkCore.Design": {
"version": "1.1.0",
"type": "build"
}
},
"frameworks": {
"netcoreapp1.1": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.1.0"
}
},
"imports": "dnxcore50"
}
},
"tools": {
"Microsoft.EntityFrameworkCore.Tools.DotNet": "1.1.0-preview4"
}
}
Ho installato il VS 2017 RC e Net Core ora usa il file csproj invece di project.json.
Ho modificato il mio csproj in Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version= "1.1.0-preview4-final"
ma quando provo il comando dotnet ef migrations add MyFirstMigration
ottengo il seguente errore:
"nessun eseguibile trovato corrispondente comando" dotnet-ef ""
Come posso risolvere questo problema con il nuovo csproj?
VS2017 sarà ufficialmente rilasciato il 7 marzo 2017. Il documento riguarda VS2015, non sono stati ancora aggiornati per riflettere le ultime modifiche di VS 2017. La modifica del progetto cs come questo risolve il problema:
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="1.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="1.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="1.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.0" />
</ItemGroup>
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version = "1.1.0-preview4-final"/>
</ItemGroup>
Anche dopo questo, quando ho provato a eseguire la prima migrazione con il comando CLI:
dotnet ef migrations add MyFirstMigration
Ho ricevuto il seguente errore: "Nessun costruttore senza parametri è stato trovato su" TContext ". Aggiungere un costruttore senza parametri a "TContext" o aggiungere un'implementazione di "IDbContextFactory" nello stesso assieme di "TContext". "
Secondo questo documento, questo accade perché gli strumenti in fase di progettazione cercano di trovare automaticamente in che modo la tua applicazione crea istanze del tuo tipo DbContext. Se EF non riesce a trovare un modo adatto per inizializzare il tuo DbContext, potresti incontrare questo errore.
Ero abbastanza sicuro di aver installato un costruttore senza parametri e sono stato in grado di vedere il contesto con il seguente comando CLI:
dotnet ef database dbContext list
L'unico modo per eseguire la migrazione è stato implementare l'interfaccia IDbContextFactory<TContext>
nel progetto. La documentazione e gli esempi su come eseguire questa operazione sono basati su VS 2015. In VS 2017 IDbContextFactory<TContext>.Create()
richiede un parametro DBContextFactoryOptions
come parametro:
public class MyContextFactory: IDbContextFactory<MyContext>
{
public MyContext Create(DbContextFactoryOptions options)
{
var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
optionsBuilder.UseSqlite("Filename=./mydatabase.db");
return new MyContext(optionsBuilder.Options);
}
}