带有实体框架6的MySql:子表

时间:2018-07-12 19:14:13

标签: c# mysql entity-framework-6

我有一个表 Users (具有不同列的表)和另一个表 UserJob

用户表结构:

public byte[] Id { get; set; }
public string language{ get; set; }
public string Password{ get; set; }

UserJob表结构

public byte[] UId { get; set; }
public string MyJob{ get; set; }

现在,UserJob表中的UId是User表的外键。

首先通过数据库技术中的代码正确完成所有映射,但是当我从Db获取 DBSet 时,我只能获取父表并获得UserJob表的异常,因为索引超出了范围的数组。

现在Db中的Uid具有数据类型二进制(18)

对于子表,从Binary(18)到byte []的SomeHow转换失败,但对于父表则很好。 (在这种情况下,User表的ID也保存为Binary(18),并且在输出中也很好地填充为byte [18]。)

所以我想这个问题仅适用于Subtable。

MySql.Data dll中存在异常。

 at MySql.Data.Types.MySqlBinary.EscapeByteArray(Byte[] bytes, Int32 length, MySqlPacket packet)
   at MySql.Data.Types.MySqlBinary.MySql.Data.Types.IMySqlValue.WriteValue(MySqlPacket packet, Boolean binary, Object val, Int32 length)
   at MySql.Data.MySqlClient.MySqlParameter.Serialize(MySqlPacket packet, Boolean binary, MySqlConnectionStringBuilder settings)
   at MySql.Data.MySqlClient.Statement.SerializeParameter(MySqlParameterCollection parameters, MySqlPacket packet, String parmName, Int32 parameterIndex)
   at MySql.Data.MySqlClient.Statement.InternalBindParameters(String sql, MySqlParameterCollection parameters, MySqlPacket packet)
   at MySql.Data.MySqlClient.Statement.BindParameters()
   at MySql.Data.MySqlClient.PreparableStatement.Execute()
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.Entity.EFMySqlCommand.ExecuteDbDataReader(CommandBehavior behavior)

也在mysql论坛上提问,但没有答案。 https://forums.mysql.com/read.php?38,651946,651946 MySql连接器:6.10.7

如果无法解决,也欢迎提出解决问题的建议。

2 个答案:

答案 0 :(得分:0)

这可能是MySql.Data中的错误。例如,此代码使用IndexOutOfRangeException崩溃:

using (var command = new MySqlCommand("select @param", connection))
{
    command.Parameters.AddWithValue("@param", new byte[16]).Size = 18;
    command.ExecuteScalar();
}

在MySql.Data库中的某个地方,MySqlParameter.Size属性似乎设置为大于参数值长度的值。

如果您找不到解决方法,那么下一个最好的办法是在https://bugs.mysql.com/提交错误报告(带有简洁的示例以重现该问题)。

答案 1 :(得分:0)

此问题的解决方法是为您的参数设置maxlength。 SomeHow MySql.Data.dll始终将参数长度设为128(这是最大长度),而不是上述情况下的实际参数长度。

因此,如果您为参数设置[MaxLength(18)](或者数据库中的参数maxlength是什么),则当尝试在MySQl.Data.dll中映射参数时,它不会中断。

希望这对某人有帮助。