Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Conexão de banco de dados MySQL dinâmico para Entity Framework 6


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 :)