sql >> データベース >  >> RDS >> Mysql

EntityFramework6の動的MySQLデータベース接続

    Entity Framework 6は、MySQLを機能させることと、動的なデータベース接続を作成することの両方に役立つ、いくつかの便利な微妙な変更を提供します。

    MySQLをEntityFramework6で動作させる

    まず、この質問に答えた時点で、EF6と互換性のある.NetコネクタドライバーはMySQL .Net Connectior 6.8.1(ベータ開発バージョン)のみです。これはこちらのMySQLの公式Webサイト

    インストール後、VisualStudioソリューションから次のファイルを参照します。

    • MySQL.Data.dll
    • MySQL.Data.Entity.EF6.dll

    また、binディレクトリなど、ビルド時にプロジェクトからアクセスできる場所にこれらのファイルをコピーする必要があります。

    次に、Web.config(またはデスクトップベースの場合はApp.config)ファイルにいくつかのアイテムを追加する必要があります。

    接続文字列:

    <connectionStrings>
        <add name="mysqlCon"
             connectionString="Server=localhost;Database=dbName;Uid=username;Pwd=password" 
             providerName="MySql.Data.MySqlClient" />
    </connectionStrings>
    

    また、<entityFramework />内にプロバイダーを追加します および<providers /> ノード、オプション(動的に定義されたデータベースを処理する場合、これは私の答えの2番目の部分で絶対に必要です)<defaultConnectionFactory />を変更できます ノード:

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

    defaultConnectionFactoryをデフォルトのSQLサーバー接続から変更する場合は、<parameter>を削除することを忘れないでください。 defaultConnectionFactoryノードにネストされているノード。 MysqlConnectionFactoryはコンストラクターのパラメーターを受け取らず、パラメーターがまだ存在する場合は失敗します。

    この段階では、Entityを使用してMySQLに接続するのは非常に簡単です。上記のconnectionStringを名前で参照するだけです。名前で接続する場合は、defaultConnectionFactoryでも機能することに注意してください。 ノードは引き続きSQLServerを指します(デフォルトではこれを指します)。

    public class ApplicationDbContext: DbContext
    {
        public ApplicationDbContext() : base("mysqlCon")
        {
        }
    }
    

    正常に接続するだけです:

    ApplicationDbContext db = ApplicationDbContext();
    

    動的に選択されたデータベース名に接続する

    この時点で、パラメータとして渡すことができるデータベースに接続するのは簡単ですが、やらなければならないことがいくつかあります。

    重要な注意事項

    まだ行っていない場合、MySQLに動的に接続する場合は、Web.configのdefaultConnectionFactoryを変更する必要があります。接続文字列をコンテキストコンストラクターに直接渡すため、使用するプロバイダーがわからず、web.configで指定されていない限り、デフォルトの接続ファクトリになります。その方法については上記をご覧ください。

    次のように、接続文字列を手動でコンテキストに渡すことができます。

    public ApplicationDbContext() : base("Server:localhost;...")
    {
    }
    

    ただし、少し簡単にするために、mySQLを設定するときに上記で作成した接続文字列に小さな変更を加えることができます。以下に示すようにプレースホルダーを追加するだけです:

    <add name="mysqlCon" connectionString="Server=localhost;Database={0};Uid=username;Pwd=password" providerName="MySql.Data.MySqlClient" />
    

    これで、ヘルパーメソッドを作成し、以下に示すようにApplicationDbContextクラスを変更できます。

    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);
        }
    }
    

    データベースの移行を使用している場合は、次の手順が重要です

    移行を使用している場合は、ApplicationDbContextがフレームワークによってSeedメソッドに渡され、データベース名に入力したパラメーターが渡されないため、失敗することがわかります。

    その問題を解決するには、次のクラスをコンテキストクラスの下部(または実際にはどこでも)に追加します。

    public class MigrationsContextFactory : IDbContextFactory<ApplicationDbContext>
    {
        public ApplicationDbContext Create()
        {
            return new ApplicationDbContext("developmentdb");
        }
    }
    

    コードファーストの移行とシードメソッドは、developmentdbを対象とします。 MySQLデータベースのスキーマ。

    これが誰かに役立つことを願っています:)



    1. PostgreSQLエラー:リレーションはすでに存在します

    2. 2つのテーブル間の差異を返すSQLクエリ

    3. SQLServerログ配布を構成する

    4. T-SQLを使用してSQLServerのCHECK制約を変更する