嗨,我正在尝试使用EF 4 MySQL(最新的连接器)和代码优先方法存储一个简单的byte[]
。
只需要进行以下操作:
public byte[] Thumbnail {get; set;}
创建时出现以下错误:
您的SQL语法有误,请查看与您的MySQL服务器版本对应的手册以获取正确的使用语法,错误位于
然后它指向了紧跟我的byte[]
声明之后的内容。
有人能给我一些快速提示吗?
嗨,我正在尝试使用EF 4 MySQL(最新的连接器)和代码优先方法存储一个简单的byte[]
。
只需要进行以下操作:
public byte[] Thumbnail {get; set;}
创建时出现以下错误:
您的SQL语法有误,请查看与您的MySQL服务器版本对应的手册以获取正确的使用语法,错误位于
然后它指向了紧跟我的byte[]
声明之后的内容。
有人能给我一些快速提示吗?
你需要使用MaxLength属性。
[MaxLength(16)]
public byte[] test { get; set; }
请注意,上述操作会将其转换为tinyblob数据类型,这可能会导致索引/主键问题。在使用迁移时,它会变成这样:
AddColumn("dbo.testDB", "test", c => c.Binary(storeType: "tinyblob"));
如果您需要索引/主键,可以使用属性column
并将TypeName
设置为"Binary"
。
[MaxLength(16), Column(TypeName = "Binary")]
public byte[] test { get; set; }
尽管对于我来说,上述结果是一个二进制(1)列(这就是我到达此处的方式)。AddColumn("dbo.testDB", "test", c => c.Binary(storeType: "binary(16)"));
不幸的是,在Column属性的类型名称中添加它不起作用。
Edit2:通过创建自定义的MySqlMigrationSqlGenerator,可以获得一个正确的数据库而无需编辑迁移文件。
internal class CustomMySqlMigrationSqlGenerator : MySqlMigrationSqlGenerator
{
protected override MigrationStatement Generate(CreateTableOperation op)
{
MigrationStatement statement = base.Generate(op);
foreach (ColumnModel column in op.Columns)
{
if (column.MaxLength.HasValue)
{
statement.Sql = statement.Sql.Replace($"`{column.Name}` binary", $"`{column.Name}` binary({column.MaxLength.Value})");
}
}
return statement;
}
}