Ho lavorato con EF Code prima in MSSQL molte volte, ma questa è la prima volta che lavoro con MySQL.
Mi è stato assegnato un database MySQL su AWS con un nome utente e una password e utilizzando MySQL Workbench posso vedere il database e creare / rilasciare tabelle ... Happy Days.
Sto avendo problemi con il mio codice Soluzione prima dove il gestore di pacchetti quando si tenta di creare tabelle in cui non riporta errori, ma le tabelle non sono visibili nel workbench ... Stanno andando da qualche parte, ma non ho idea di dove .. .
Ho abilitato le migrazioni e hanno come prefisso i nomi dei miei tavoli con
Questa è la mia stringa di connessione:
<connectionStrings>
<add name="MyContext" providerName="MySql.Data.MySqlClient"
connectionString="server=mysql-portal.blahblahblah.us-somewhere-1.rds.amazonaws.com;port=3306;database=mydatabasename;uid=myusername;password=mypassword"/>
</connectionStrings>
Questo è il mio DbContext:
public class MyContext : DbContext
{
public MyContext() : base("MyContext")
{
Database.SetInitializer<MyContext>(new MyDbInitializer());
}
public virtual DbSet<AgentData> AgentDatas { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.HasDefaultSchema("mydatabasename");
}
}
public class MyDbInitializer : CreateDatabaseIfNotExists<MyContext>
{
protected override void Seed(MyContext context)
{
base.Seed(context);
}
}
Quando aggiungo una migrazione il codice sembra corretto:
CreateTable(
"mydatabasename.AgentData",
c => new
{
Id = c.Long(nullable: false, identity: true),
State = c.String(),
AgentName = c.String(),
AgentLogin = c.String(),
AgentPassword = c.String(),
NAID = c.String(),
License = c.String(),
Proxy = c.String(),
Enabled = c.Boolean(nullable: false),
American_States_id = c.Long(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("mydatabasename.American_States", t => t.American_States_id)
.Index(t => t.American_States_id);
Come ho detto, quando eseguo questa migrazione e aggiorno il database non ho alcun errore.
Ma non riesco a vedere il tavolo sul banco di lavoro e se provo a quanto segue dice che la tabella non esiste ...
public static async Task<List<Model.AgentData>> GetAllAgents()
{
using (MyContext db = new MyContext())
{
return await db.AgentDatas.ToListAsync();
}
}
Sono perplesso ... Non ho permessi su nessun altro database ... Quindi dove stanno andando e cosa sto facendo male che non appaiono nel database corretto come specificato da:
modelBuilder.HasDefaultSchema("mydatabasename");
AGGIORNARE:
La stranezza continua.
Non riesco a trovare alcun motivo per cui quanto sopra non funziona. Così ho deciso di avviare una soluzione completamente pulita e di crearla da zero in quella soluzione.
E funziona perfettamente. Riesco a vedere le mie tabelle e posso aggiungere / eliminare tabelle al database.
Quindi, ho pensato, nessun problema. Ora aggiungerò quel progetto di lavoro alla mia altra soluzione. Ho rimosso la vecchia soluzione dalla mia soluzione principale. Cancellata la directory. Copiato il progetto di lavoro nella directory principale della soluzione e aggiunto alla soluzione ...
E inizia a fare la stessa cosa ... Segnala di creare le tabelle in Gestione pacchetti senza errori, ma non riesco a vederle in Workbench e non posso aggiungere dati a loro.
Entrambe le soluzioni / progetti sono in Visual Studio Community 2017.
Quello che ha funzionato era una soluzione contenente solo il progetto di lavoro. La soluzione che non funziona ha più progetti esistenti al suo interno.
Perché, quando importare un progetto di lavoro nella soluzione, smette di funzionare ....
Qualcuno potrebbe azzardare un'ipotesi?
AGGIORNARE:
Questo sta iniziando a sembrare più un bug in VS2017
Ho appena trovato tutte le tabelle e i database mancanti nella mia istanza MSSQL locale!
È come quando si trova in una soluzione multi-progetto, scegliendo l'istanza locale di MSSQL e ignorando la stringa di connessione al database MySQL in App.config!
Quando vado in "Servizi" e interrompo la mia istanza locale di SQL Server e provo a fare un Enable-Migrations -Force ottengo l'errore
Il server non è stato trovato o non era accessibile. Verificare che il nome dell'istanza sia corretto e che SQL Server sia configurato per consentire le connessioni remote. (provider: Named Pipes Provider, errore: 40 - Impossibile aprire una connessione a SQL Server) ---> System.ComponentModel.Win32Exception: il sistema non riesce a trovare il file specificato
Sono riuscito a risolvere il mio problema con 2 modifiche
Ho aggiunto [DbConfigurationType (typeof (MySql.Data.Entity.MySqlEFConfiguâ € "ration))] come una dichiarazione sulla mia classe HudHomeContext
Ho inserito la stringa di connessione nella mia dichiarazione di base ...
Quindi ora sembra così:
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfigu‌​ration))]
public class MyContext : DbContext
{
public MyContext() : base("server=mysql-portal.blahblah.us-blah-1.rds.amazonaws.com;port=3306;database=blahblah;uid=myusername;password=MYPASSWORD")
{
Database.SetInitializer<MyContext>(new MyDbInitializer());
}