Mysqlの下でEF Code Firstを使ってテーブルEngineを指定するのは無効な考え方を解決します

4304 ワード

Code Firstでテーブルを作成するときにupdate-database-verboseでスクリプトを表示すると、すべてのテーブルのデフォルトEngineがInnoDBであることがわかります.
業務要求のため時計のEngineはMyISAMです.
Migrationのupメソッドに変更
変更前のコードは次のとおりです.
            CreateTable(

                "Tests",

                c => new

                    {

                        ID = c.Int(nullable: false),

                        Name = c.String(unicode: false),

                })

                .PrimaryKey(t => t.ID);


方法を考えてCreateTableメソッドからベースクラスCreateTableメソッドの説明を見る
//

        //   :

        //     Adds an operation to create a new table.

        //

        //   :

        //   name:

        //     The name of the table. Schema name is optional, if no schema is specified

        //     then dbo is assumed.

        //

        //   columnsAction:

        //     An action that specifies the columns to be included in the table.  i.e. t

        //     => new { Id = t.Int(identity: true), Name = t.String() }

        //

        //   anonymousArguments:

        //     Additional arguments that may be processed by providers. Use anonymous type

        //     syntax to specify arguments e.g. 'new { SampleArgument = "MyValue" }'.

        //

        //     :

        //   TColumns:

        //     The columns in this create table operation. You do not need to specify this

        //     type, it will be inferred from the columnsAction parameter you supply.

        //

        //     :

        //     An object that allows further configuration of the table creation operation.

        protected internal TableBuilder<TColumns> CreateTable<TColumns>(string name, Func<ColumnBuilder, TColumns> columnsAction, object anonymousArguments = null);

はいanonymousArgumentsパラメータは私が使えるものです説明によるとnew{Engine="MyISAM"}
コードを変更すると、次のようになります.
            CreateTable(

                "Tests",

                c => new

                    {

                        ID = c.Int(nullable: false),

                        Name = c.String(unicode: false),

                    }, new { Engine = "MyISAM" })

                .PrimaryKey(t => t.ID);


さらにupdate-database-verboseスクリプトの結果を見てもデフォルトのInnoDBです
当時はPropertyNameが大文字と小文字を区別してnew{engine="MyISAM"}new{ENGINE="MyISAM"}
やっぱりだめだ.nnd mysql code firstに関する資料が少なすぎます公式サイトでは簡単なdemoです
接続者のソースをダウンロードすることができません自分でここをクリックを見てみます
プロジェクトを開くData.EntityのMySqlMigrationSqlGenerator.cs
    protected virtual MigrationStatement Generate(CreateTableOperation op)

    {

      StringBuilder sb = new StringBuilder();

      if (generatedTables == null)

        generatedTables = new List<string>();



      if (!generatedTables.Contains(op.Name))

      {

        generatedTables.Add(op.Name);

      }

      sb.Append("create table " + "`" + op.Name + "`" + " (");



      //columns

      sb.Append(string.Join(",", op.Columns.Select(c => "`" + c.Name + "` " + Generate(c))));



      if (op.PrimaryKey != null && !sb.ToString().Contains("primary key"))

      {

        sb.Append(",");

        sb.Append("primary key ( " + string.Join(",", op.PrimaryKey.Columns.Select(c => "`" + c + "`")) + ") ");

      }



        sb.Append(") engine=InnoDb auto_increment=0");



        return new MigrationStatement() { Sql = sb.ToString() };

    }


長いことやったが、指定Engineのことは全然考えていなかった.
ここまでは続けられないソースコードの修正を提供しただけだ
      if (op.AnonymousArguments.ContainsKey("Engine"))

      {

          sb.Append(string.Format(") engine={0} auto_increment=0", op.AnonymousArguments["Engine"]));

      }

      else

      {

          sb.Append(") engine=InnoDb auto_increment=0");

      }


そしてnew{Engine="MyISAM"}で大丈夫です
後でmysqlにバグレポートを提出します.皆さんもmysqlが修復するのを待つことができます.
mysqlに機能欠損バグレポートを送信しましたBug#68237