Entity Framework 6 tilbyder nogle praktiske subtile ændringer, som både hjælper med at få MySQL til at fungere og også skabe dynamiske databaseforbindelser.
Få MySQL til at fungere med Entity Framework 6
For det første, på datoen for mit svar på dette spørgsmål, er de eneste .Net-stikdrivere, der er kompatible med EF6, MySQL .Net Connectior 6.8.1 (beta-udviklingsversion), som kan findes på det officielle MySQL-websted her .
Efter installation skal du henvise til følgende filer fra din Visual Studio-løsning:
- Mysql.Data.dll
- Mysql.Data.Entity.EF6.dll
Du bliver også nødt til at kopiere disse filer et sted, hvor de vil være tilgængelige for projektet under byggetiden, såsom bin-mappen.
Dernæst skal du tilføje nogle elementer til din Web.config-fil (eller App.config, hvis den er baseret på skrivebordet).
En forbindelsesstreng:
<connectionStrings>
<add name="mysqlCon"
connectionString="Server=localhost;Database=dbName;Uid=username;Pwd=password"
providerName="MySql.Data.MySqlClient" />
</connectionStrings>
Tilføj også udbyderen inde i
og
node:
<entityFramework>
<defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" />
<providers>
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
</providers>
</entityFramework>
Hvis du ændrer standardConnectionFactory fra standard sql-serverforbindelsen, så glem ikke at fjerne
noder, som er indlejret i standardConnectionFactory-knuden. MysqlConnectionFactory tager ingen parametre for sin konstruktør og vil fejle, hvis parametrene stadig er der.
På dette stadium er det ret nemt at oprette forbindelse til MySQL med Entity, du kan blot henvise til forbindelsesstrengen ovenfor ved navn. Bemærk, at hvis du forbinder med navn, vil dette fungere, selvom defaultConnectionFactory
node peger stadig på SQL Server (hvilket den gør som standard).
public class ApplicationDbContext: DbContext
{
public ApplicationDbContext() : base("mysqlCon")
{
}
}
Det er bare et spørgsmål om at forbinde normalt:
ApplicationDbContext db = ApplicationDbContext();
Opretter forbindelse til et dynamisk valgt databasenavn
På dette tidspunkt er det nemt at oprette forbindelse til en database, som vi kan sende som en parameter, men der er et par ting, vi skal gøre.
Vigtig bemærkning
Hvis du ikke allerede har gjort det, SKAL du ændre standardConnectionFactory i Web.config, hvis du ønsker at oprette forbindelse til MySQL dynamisk. Da vi sender en forbindelsesstreng direkte til kontekstkonstruktøren, vil den ikke vide, hvilken udbyder den skal bruge og vil vende tilbage til sin standardforbindelsesfabrik, medmindre den er angivet inweb.config. Se ovenfor om, hvordan du gør det.
Du kan sende en forbindelsesstreng manuelt til konteksten som denne:
public ApplicationDbContext() : base("Server:localhost;...")
{
}
Men for at gøre det lidt nemmere, kan vi lave en lille ændring af forbindelsesstrengen, vi lavede ovenfor, da vi satte mySQL op. Tilføj blot en pladsholder som vist nedenfor:
<add name="mysqlCon" connectionString="Server=localhost;Database={0};Uid=username;Pwd=password" providerName="MySql.Data.MySqlClient" />
Nu kan vi bygge en hjælpemetode og ændre ApplicationDbContext-klassen som vist nedenfor:
public class ApplicationDbContext: DbContext
{
public ApplicationDbContext(string dbName) : base(GetConnectionString(dbName))
{
}
public static string GetConnectionString(string dbName)
{
// Server=localhost;Database={0};Uid=username;Pwd=password
var connString =
ConfigurationManager.ConnectionStrings["mysqlCon"].ConnectionString.ToString();
return String.Format(connString, dbName);
}
}
Hvis du bruger databasemigreringer, er følgende trin vigtigt
Hvis du bruger migreringer, vil du opdage, at ApplicationDbContext vil blive videregivet til din Seed-metode af frameworket, og det vil mislykkes, fordi det ikke vil sende den parameter, vi indsætter for databasenavnet.
Tilføj følgende klasse til bunden af din kontekstklasse (eller hvor som helst virkelig) for at løse det problem.
public class MigrationsContextFactory : IDbContextFactory<ApplicationDbContext>
{
public ApplicationDbContext Create()
{
return new ApplicationDbContext("developmentdb");
}
}
Dine code-first-migreringer og seed-metoder vil nu målrette mod developmentdb
skema i din MySQL-database.
Håber dette hjælper nogen :)