C# 首先使用实体框架4、MySQL和代码存储字节数组?

C# 首先使用实体框架4、MySQL和代码存储字节数组?,c#,mysql,entity-framework,ef-code-first,C#,Mysql,Entity Framework,Ef Code First,嘿,我正在尝试使用EF4MySQL(最新的连接器)和代码优先的方法存储一个简单的byte[] 简单地做: public byte[] Thumbnail {get; set;} 创建时给我以下错误: 您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 接近 然后它指向我的byte[]声明后面的内容 有人能给我一些提示吗?你需要使用MaxLength属性 [MaxLength(16)] public byte[] test { get; set; } 请注意,上

嘿,我正在尝试使用EF4MySQL(最新的连接器)和代码优先的方法存储一个简单的
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"));
如果需要索引/主键,可以使用属性
,并将
类型名
设置为
“二进制”

[MaxLength(16), Column(TypeName = "Binary")]
public byte[] test { get; set; }
虽然上面的结果对我来说是一个二进制(1)列(我就是这样得到这里的)

编辑:要获得正确长度的二进制数组,只需在迁移文件中的
二进制
之后添加
(16)

AddColumn("dbo.testDB", "test", c => c.Binary(storeType: "binary(16)"));
不幸的是,将其添加到Column属性的typename中并不起作用

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

我错过什么了吗?Entity Framework不是只与SQL Server兼容吗?@Yuck Entity Framework不仅与SQL Server兼容,您可以在这里看到列表:但对于代码优先,它更精简list@Jani但据我所知,mysql仍然应该得到充分支持。我选择将我的缩略图保存为一个文件,只存储url——尽管另一种方法更可取,所以我保留这个问题。哇。。。4岁的职位。嗯,我无法证实这是对的,所以我要相信你的话。这个问题仍然在EF Core 2.1中使用第一方MySQL提供商出现(7年后)。Pomelo解决了这个问题,但如果不是选项,可以使用
text
类型来存储二进制数据。