#mysql #ef-core-3.1
#mysql #ef-core-3.1
Вопрос:
У меня было требование прочитать некоторые данные с сервера MySQL для решения API. База данных была скомпонована, и мы столкнулись с проблемой, когда идентификаторы GUID хранятся в ‘char (36) DEFAULT NULL’ при попытке прочитать объекты с этим столбцом, а значение базы данных равно null, выдается следующее исключение:
Exception thrown: 'System.ArgumentOutOfRangeException' in System.Text.Encoding.CodePages.dll
Exception thrown: 'System.ArgumentOutOfRangeException' in System.Private.CoreLib.dll
Microsoft.EntityFrameworkCore.Query: Error: An exception occurred while iterating over the results of a query for context type 'DbContext'.
System.ArgumentOutOfRangeException: Non-negative number required. (Parameter 'count')
at System.Text.EncodingNLS.GetString(Byte[] bytes, Int32 index, Int32 count)
at MySql.Data.MySqlClient.NativeDriver.ReadColumnValue(Int32 index, MySqlField field, IMySqlValue valObject)
at MySql.Data.MySqlClient.ResultSet.ReadColumnData(Boolean outputParms)
at MySql.Data.MySqlClient.ResultSet.NextRow(CommandBehavior behavior)
at MySql.Data.MySqlClient.MySqlDataReader.Read()
at System.Data.Common.DbDataReader.ReadAsync(CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()
System.ArgumentOutOfRangeException: Non-negative number required. (Parameter 'count')
at System.Text.EncodingNLS.GetString(Byte[] bytes, Int32 index, Int32 count)
at MySql.Data.MySqlClient.NativeDriver.ReadColumnValue(Int32 index, MySqlField field, IMySqlValue valObject)
at MySql.Data.MySqlClient.ResultSet.ReadColumnData(Boolean outputParms)
at MySql.Data.MySqlClient.ResultSet.NextRow(CommandBehavior behavior)
at MySql.Data.MySqlClient.MySqlDataReader.Read()
at System.Data.Common.DbDataReader.ReadAsync(CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()
Exception thrown: 'System.ArgumentOutOfRangeException' in Microsoft.EntityFrameworkCore.Relational.dll
Каркасная модель:
public class XTable
{
public int Id { get; set; }
public string ProblemColumn { get; set; }
}
modelBuilder.Entity<XTable>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity.ToTable("XTable");
entity.Property(e => e.ProblemColumn)
.HasColumnName("problemColumn")
.HasMaxLength(36)
.IsFixedLength();
}
**Context DBSet**
public virtual DbSet<XTable> XTables{ get; set; }
**Example of use case**
var result = dbContext.XTables.SingleOrDefaultAsync(a => a.Id == id);
Окружающая среда:
.Net Standard 2.0, используемый 3.1 asp netcore
Майкрософт.EntityFrameworkCore 3.1.9 MySQL.Data.EntityFrameworkCore 8.0.22
Обновил зависимости до последних стабильных значений, как показано выше.
Как уже упоминалось, сузил его только тогда, когда значение столбца строки равно null, я пробовал различные варианты модели, удаляя «HasMaxLength», «IsFixedLength», что не имело никакого значения.
Если значение строки в базе данных пустое или содержит идентификатор guid, оно читается нормально.
Просто интересно, знает ли кто-нибудь о проблемах MySQL и ef core с столбцами символов?
Ответ №1:
Это ошибка MySQL.Версия данных 8.0.22. У меня та же проблема, и я жду следующего выпуска. https://bugs.mysql.com/bug.php?id=101252