我有一个表 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
如果无法解决,也欢迎提出解决问题的建议。
答案 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中映射参数时,它不会中断。
希望这对某人有帮助。