Questo sembra essere un problema che è stato già risolto , almeno per i database SQLite.
La mia soluzione è composta da 3 progetti:
Ho installato i seguenti pacchetti nel progetto WPF principale:
Microsoft.EntityFrameworkCore.Tools
Microsoft.EntityFrameworkCore.Design
I progetti 2 e 3 sono citati nel mio progetto WPF principale. Quindi, in sostanza, dovrebbe essere sufficiente per l'EF risolvere i DbContextes.
Tuttavia, non lo è - poiché l'esecuzione di Add-Migration
sul mio progetto WPF comporta:
PM> Add-Migration "Initial"
No DbContext was found in assembly 'TestWPFProject'. Ensure that you're using the correct assembly and that the type is neither abstract nor generic.
Il passaggio al progetto 3
come predefinito nella console di Gestione pacchetti comporta:
PM> Add-Migration "Initial"
Unable to create an object of type 'ClientDbContext'. Add an implementation of 'IDesignTimeDbContextFactory<ClientDataStoreDbContext>' to the project, or see https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns supported at design time.
Come posso utilizzare correttamente le migrazioni EF Core con il mio progetto di biblioteca di classe e il progetto WPF?
Ho riprodotto la tua soluzione e ho trovato ... una soluzione :)
Andiamo ad approfondire.
Nome : ClassLibrary1 .
Tipo : libreria di classi 2.0 Standard .NET .
Dipendenze : nessuno
Nella mia soluzione di test, contiene solo una classe, un modello chiamato Persona .
Person.cs
namespace ClassLibrary1
{
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
}
}
Nome : EFClassLibrary .
Tipo : libreria di classi 2.0 Standard .NET .
Dipendenze :
Questo progetto, nella mia soluzione di prova, contiene solo una classe: il contesto del database.
ClientDbContext.cs
using ClassLibrary1;
using Microsoft.EntityFrameworkCore;
namespace EFClassLibrary
{
public class ClientDbContext : DbContext
{
const string connectionString = "Server=(localdb)\\mssqllocaldb;Database=ClientDb;Trusted_Connection=True;";
public ClientDbContext() : base() { }
public ClientDbContext(DbContextOptions<ClientDbContext> options) : base(options) { }
public DbSet<Person> People { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(connectionString);
}
}
}
In questa classe un definito e ha utilizzato la stringa di connessione per connettersi al database (presupponendo che sia LocalDb SQL Server). Se si desidera inserire la stringa di connessione in un file di configurazione, è possibile aggiungere un file di configurazione condiviso nella soluzione e quindi fare riferimento a tale file nel proprio file App.config
(per ulteriori informazioni, dare un'occhiata a questa pagina )
Per poter aggiungere migrazioni su questo progetto senza impostare come progetto di avvio altri progetti, è necessario impostare il framework di destinazione. Fare clic con il tasto destro del mouse sul progetto e fare clic sulla voce Modifica EFClassLibrary.csproj . Sotto la <TargetFramework>netstandard2.0</TargetFramework>
, dovresti aggiungere un'altra linea che specifica quale framework vuoi scegliere come target. Per targetizzare .NET Framework 4.7, è necessario aggiungere
<TargetFramework>net47</TargetFramework>
Un elenco di tutti i valori consentiti può essere trovato qui .
Il mio EFClassLibrary.csproj è simile al seguente codice dopo aver aggiunto .NET Framework 4.7 come destinazione.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>net47</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.1.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj" />
</ItemGroup>
</Project>
Ora sei pronto per aggiungere la tua prima migrazione. Aprire la console di Gestione pacchetti e impostare come progetto predefinito EFClassLibrary . Inoltre, imposta tale progetto come progetto di avvio (fai clic con il tasto destro del mouse sul progetto e fai clic sulla voce Imposta come progetto di avvio ).
genere
PM> Add-Migration Initial
poi
PM> Update-Database
Nome : WpfApp1 .
Tipo : Applicazione WPF che utilizza .NET Framework 4.7 .
Dipendenze :
In questo progetto non ho aggiunto file. MainWindow.xaml.cs
appena modificato il file MainWindow.xaml.cs
per verificare che tutto funzioni correttamente.
MainWindow.xaml.cs
using ClassLibrary1;
using EFClassLibrary;
using System.Windows;
namespace WpfApp1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var db = new ClientDbContext();
db.People.Add(new Person()
{
Name = "Omar"
});
db.SaveChanges();
}
}
}
Spero che sia d'aiuto :)
Quello che ha funzionato per me è semplicemente fare le tue cose normali sul tuo UI Side Startup.cs
services.AddDbContext<ShentonEvaDbContext>(options =>
options.UseSqlServer(
_configuration.GetConnectionString("DevelopmentConnection")));
Quindi sulla tua configurazione DBContext aggiungi solo un costruttore
public ShentonEvaDbContext(DbContextOptions<ShentonEvaDbContext> options) : base(options)
{
}
Dopodiché, sulla console di Package Manager, esegui quanto segue
dotnet ef migrations add InitialMigration --project "NameOfDbContextProject" --startup-project "NameOfWebUIProject"
Quindi Everytihng è stato aggiunto e fa lo stesso per l'aggiornamento del database