Mysqlの下でEF Code Firstを使ってテーブルEngineを指定するのは無効な考え方を解決します
4304 ワード
Code Firstでテーブルを作成するときにupdate-database-verboseでスクリプトを表示すると、すべてのテーブルのデフォルトEngineがInnoDBであることがわかります.
業務要求のため時計のEngineはMyISAMです.
Migrationのupメソッドに変更
変更前のコードは次のとおりです.
方法を考えてCreateTableメソッドからベースクラスCreateTableメソッドの説明を見る
はいanonymousArgumentsパラメータは私が使えるものです説明によるとnew{Engine="MyISAM"}
コードを変更すると、次のようになります.
さらにupdate-database-verboseスクリプトの結果を見てもデフォルトのInnoDBです
当時はPropertyNameが大文字と小文字を区別してnew{engine="MyISAM"}new{ENGINE="MyISAM"}
やっぱりだめだ.nnd mysql code firstに関する資料が少なすぎます公式サイトでは簡単なdemoです
接続者のソースをダウンロードすることができません自分でここをクリックを見てみます
プロジェクトを開くData.EntityのMySqlMigrationSqlGenerator.cs
長いことやったが、指定Engineのことは全然考えていなかった.
ここまでは続けられないソースコードの修正を提供しただけだ
そしてnew{Engine="MyISAM"}で大丈夫です
後でmysqlにバグレポートを提出します.皆さんもmysqlが修復するのを待つことができます.
mysqlに機能欠損バグレポートを送信しましたBug#68237
業務要求のため時計の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