Sto creando un'applicazione ASP.NET Core 1.1.0 che deve accedere a un database MySQL esistente utilizzando Entity Framework Core, che sto creando in Visual Studio 2015 con tutti gli aggiornamenti più recenti. Ho iniziato a utilizzare il provider MySQL "ufficiale" (MySql.Data.EntityFrameworkCore), ma ho lo stesso problema con il pravider Pomelo (Pomelo.EntityFrameworkCore.MySql).
L'oggetto contesto immesso nel mio controller Home ha tutti i tipi di eccezioni NotImplemented, come puoi vedere nell'immagine. I membri sono una delle mie raccolte DBSet, che utilizzano il membro POCO. (A proposito, non sto pensando di utilizzare le migrazioni, quindi non è un fattore.) Questo è lo stato dell'oggetto contesto non appena viene iniettato nel controller, prima ancora di provare ad accedere ai dati.
Il dettaglio completo di un messaggio tipico è:
((Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure) this.db.Members). L'istanza 'ha generato un'eccezione di tipo' System.NotImplementedException
Non penso che ci sia qualcosa di molto interessante nel mio file project.json, ma le righe rilevanti sono:
"Pomelo.EntityFrameworkCore.MySql": "1.1.0",
"Pomelo.EntityFrameworkCore.MySql.Design": "1.1.0"
In Startup.cs nel metodo ConfigureServices, ho queste istruzioni:
string connectionString = Configuration.GetConnectionString("ManageRCNConnection");
services.AddDbContext<MembersContext>(options => options.UseMySql(connectionString));
Le cose sono piuttosto semplici a questo punto.
Finora, il mio Google-foo mi ha deluso cercando di capire cosa c'è che non va.
Qualcuno può darmi un indizio su quale sia il problema?
Grazie!
Aggiornamento : se ignoro gli errori nella struttura come suggerisce @Tseng, ottengo errori la prima volta che cerco di ottenere un'entità dal database.
Ecco il codice per il mio MembersContext. Ho rimosso alcune proprietà, ma sono solo più raccolte DbSet.
public class MembersContext : DbContext
{
public MembersContext(DbContextOptions<MembersContext> options) : base(options)
{ }
public DbSet<Member> Members { get; set; }
public DbSet<FamilyMember> FamilyMembers { get; set; }
public DbSet<Membership> Memberships { get; set; }
...
}
Non sto usando una fabbrica di contesti, potrebbe essere questo il problema?
Bene, questo è stato un processo frustrante, ma alla fine ho risolto tutto. Grazie mille a @Tseng per le domande e i commenti, che mi hanno aiutato a spingermi nella giusta direzione.
Per prima cosa, sono passato a utilizzare il provider Pomelo MySQL. Il fornitore ufficiale di MySQL è pre-release, ma ho pensato che fosse abbastanza lungo almeno per iniziare su questo nuovo progetto. Non è, da oggi. (Anche Sapient Guardian sembra avere un solido fornitore, ma non ho avuto bisogno di provarlo.)
In secondo luogo, mi sono reso conto che qualcosa non era giusto riguardo alla mia classe di contesto oggetto, e che era la fonte dei miei problemi. Così sono tornato a far lavorare le impalcature. Ho provato un certo numero di cose, ma questo è come sono finite le parti rilevanti della sezione delle dipendenze del mio file project.json:
"Microsoft.EntityFrameworkCore.Tools": "1.1.0-preview4-final",
"Microsoft.EntityFrameworkCore.Design": "1.1.0",
"Pomelo.EntityFrameworkCore.MySql": "1.1.1-prerelease-10000",
"Pomelo.Data.MySql": "1.0.0",
"Pomelo.EntityFrameworkCore.MySql.Design": "1.1.1-prerelease-10000" },
Sembra che siano tutti i pacchetti richiesti per lo scaffolding e le migrazioni, anche se non sto utilizzando le migrazioni. Non ho bisogno di aggiungere nulla alla sezione strumenti del file.
Quindi questo comando ha funzionato nella console di Gestione pacchetti in Visual Studio 2015:
Scaffold-DbContext "<connection string>" Pomelo.EntityFrameworkCore.MySql -OutputDir Models
Ecco! Un contesto dell'oggetto corretto e classi di entità. (Mi aspetto che anche i comandi ef dotnet funzionino, ma non li abbiamo provati).
Successivamente, ho riscontrato un problema con "Impossibile eseguire il cast dell'oggetto di tipo" System.String "per digitare" System.Byte "." errori in un oggetto entità. Ciò si è verificato perché il provider (o forse il connettore MySQL) ha alcuni problemi con i campi char e le stringhe in .NET Core. Ho cambiato quei campi in varchar, e tutto andava bene.