使用Entity Framework 4、MySQL和Code First存储字节数组?

11

嗨,我正在尝试使用EF 4 MySQL(最新的连接器)和代码优先方法存储一个简单的byte[]

只需要进行以下操作:

public byte[] Thumbnail {get; set;}

创建时出现以下错误:

您的SQL语法有误,请查看与您的MySQL服务器版本对应的手册以获取正确的使用语法,错误位于

然后它指向了紧跟我的byte[]声明之后的内容。

有人能给我一些快速提示吗?


我有什么遗漏吗?Entity Framework 不只与 SQL Server 兼容吗? - Yuck
@Yuck Entity Framework 不仅与 SQL Server 兼容,您可以在此处查看列表:http://en.wikipedia.org/wiki/ADO.NET_Entity_Framework#Entity_Framework_ADO.NET_providers - King Chan
但对于Code First来说,它是一个更精简的列表。 - Jahan Zinedine
@Jani 但是据我所知,MySQL 仍然应该得到充分支持。我选择将缩略图保存为文件,并仅存储 URL - 尽管另一种方法更可取,因此我将问题保持开放状态。 - Dynde
1个回答

11

你需要使用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)列(这就是我到达此处的方式)。
编辑: 为了获取正确长度的二进制数组,在迁移文件中,在binary后面简单地添加(16)即可。
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;
    }
}

哇...这是四年前的帖子。嗯,我无法验证这是否正确,所以我只能相信你的话。 - Dynde
这个问题在使用官方的MySQL提供程序时,在EF Core 2.1中仍然存在(7年后)。Pomelo修复了这个问题,但如果不是一个选项,可以使用“text”类型来存储二进制数据。 - chakeda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接