O Entity Framework 6 oferece algumas mudanças sutis úteis que ajudam a fazer o MySQL funcionar e também criar conexões de banco de dados dinâmicas.
Como fazer o MySQL funcionar com o Entity Framework 6
Primeiro, na data da minha resposta a esta pergunta, os únicos drivers de conector .Net compatíveis com EF6 são o MySQL .Net Connectior 6.8.1 (versão de desenvolvimento Beta) que pode ser encontrado no site oficial do MySQL aqui .
Após a instalação, faça referência aos seguintes arquivos da sua solução do Visual Studio:
- Mysql.Data.dll
- Mysql.Data.Entity.EF6.dll
Você também precisará copiar esses arquivos em algum lugar onde eles possam ser acessados pelo projeto durante o tempo de compilação, como o diretório bin.
Em seguida, você precisa adicionar alguns itens ao seu arquivo Web.config (ou App.config se for baseado em desktop).
Uma cadeia de conexão:
<connectionStrings>
<add name="mysqlCon"
connectionString="Server=localhost;Database=dbName;Uid=username;Pwd=password"
providerName="MySql.Data.MySqlClient" />
</connectionStrings>
Adicione também o provedor, dentro do
<entityFramework />
e <providers />
nodes, opcionalmente (isso é uma necessidade absoluta na segunda parte da minha resposta, ao lidar com bancos de dados definidos dinamicamente), você pode alterar o <defaultConnectionFactory />
nó:<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>
Se você alterar o defaultConnectionFactory da conexão padrão do sql server, não se esqueça de remover o
<parameter>
nós que estão aninhados no nó defaultConnectionFactory. O MysqlConnectionFactory não aceita nenhum parâmetro para seu construtor e falhará se os parâmetros ainda estiverem lá. Neste estágio, é muito fácil conectar-se ao MySQL com Entity, você pode apenas referir-se à connectionString acima pelo nome. Observe que, se conectar por nome, isso funcionará mesmo se o
defaultConnectionFactory
node ainda aponta para o SQL Server (o que ele faz por padrão). public class ApplicationDbContext: DbContext
{
public ApplicationDbContext() : base("mysqlCon")
{
}
}
O é apenas uma questão de conectar normalmente:
ApplicationDbContext db = ApplicationDbContext();
Conectando-se a um nome de banco de dados selecionado dinamicamente
Neste ponto, é fácil conectar-se a um banco de dados que podemos passar como parâmetro, mas há algumas coisas que precisamos fazer.
Observação importante
Se você ainda não o fez, você DEVE alterar o defaultConnectionFactory no Web.config se desejar se conectar ao MySQL dinamicamente. Como estaremos passando uma string de conexão diretamente para o construtor de contexto, ele não saberá qual provedor usar e voltará para sua fábrica de conexões padrão, a menos que especificado em web.config. Veja acima como fazer isso.
Você pode passar uma string de conexão manualmente para o contexto assim:
public ApplicationDbContext() : base("Server:localhost;...")
{
}
Mas para facilitar um pouco, podemos fazer uma pequena alteração na string de conexão que fizemos acima ao configurar o mySQL. Basta adicionar um espaço reservado como mostrado abaixo:
<add name="mysqlCon" connectionString="Server=localhost;Database={0};Uid=username;Pwd=password" providerName="MySql.Data.MySqlClient" />
Agora podemos construir um método auxiliar e alterar a classe ApplicationDbContext conforme mostrado abaixo:
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);
}
}
Se você estiver usando migrações de banco de dados, a etapa a seguir é importante
Se você estiver usando migrações, descobrirá que o ApplicationDbContext será passado para seu método Seed pela estrutura e falhará porque não passará o parâmetro que colocamos para o nome do banco de dados.
Adicione a seguinte classe na parte inferior da sua classe de contexto (ou em qualquer lugar realmente) para resolver esse problema.
public class MigrationsContextFactory : IDbContextFactory<ApplicationDbContext>
{
public ApplicationDbContext Create()
{
return new ApplicationDbContext("developmentdb");
}
}
Suas migrações code-first e métodos de propagação agora terão como alvo o
developmentdb
esquema em seu banco de dados MySQL. Espero que isso ajude alguém :)