Ошибка, необходимо указать действительную информацию для анализа в строке при использовании EF Core Value Conversion - PullRequest
0 голосов
/ 14 октября 2019

На основе документов EF Core (https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions), Я пытаюсь использовать новое преобразование значений EF Core для перечисления. Я хочу сохранить перечисление в виде строки в таблице базы данных SQL.

Вот сущность и перечисление.

public enum InputSetType
{
    TypeA, TypeB
}

public class MonthlyInputSet
{
    public int Id { get; set; }
    public InputSetType Type { get; set; }
}

Здесь я настраиваю объект MonthlyInputSet:

public class MonthlyInputSetConfiguration : IEntityTypeConfiguration<MonthlyInputSet>
{
    public void Configure(EntityTypeBuilder<MonthlyInputSet> builder)
    {
        builder.Property(mis => mis.Type).HasConversion(v => v.ToString(), v => (InputSetType)Enum.Parse(typeof(InputSetType), v));
    }
}

Итак, я пытаюсь выполнить базовый запрос, чтобы получить эти данные иСбой. Запрос:

var saved = await _context.MonthlyInputSets.Include(mis => mis.InsertedBy)
                                                     .Include(mis => mis.UpdatedBy)
                                                     .Include(mis => mis.MonthlyInputs)
                                                         .ThenInclude(mi => mi.EmissionsUnit)
                                                     .FirstOrDefaultAsync(mis => mis.Id == id);

Но в первой строке этого запроса выдается сообщение об ошибке: «ArgumentException: необходимо указать действительную информацию для разбора в строке». Поэтому я предполагаю, чтоЯ неправильно настроил преобразование строки в таблице в перечисление в C #.

Полная трассировка необработанного стека:

enter image description here

Я проверил, что правильное строковое значение возвращается из базы данных. Оно не равно нулю и не является пустой строкой. Возвращенное строковое значение идеально соответствует члену перечисления.

 public void Configure(EntityTypeBuilder<MonthlyInputSet> builder)
    {
        builder.Property(mis => mis.Type).HasConversion(
            convertToProviderExpression: v => v.ToString(), 
            convertFromProviderExpression: v => Troubleshooting(v)
        );
    }

    private InputSetType Troubleshooting(string v)
    {
        return (InputSetType)Enum.Parse(typeof(InputSetType), v);
    }

эти дваизображения показывают, что тext в каждой строке в столбце типа базы данных идентична второму члену перечисления, сопоставленному с этим полем.

enter image description here enter image description here

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Единственный способ воспроизвести эту ошибку - это v, чтобы быть пустой строкой , то есть "". Не ноль.

Это:

Enum.Parse(typeof(InputSetType),"xx")

Броски Requested value 'xx' was not found..

При этом:

 Enum.Parse(typeof(InputSetType),"")

Броски:

Must specify valid information for parsing in the string. (Parameter 'value')

Кажется, некоторые строки содержат пустую строку вместо null.

Вам придется решить, что делать с этими значениями - это плохие данные? Или приложение должно обработать их и заменить их на какое-либо значение по умолчанию?

Если вы решите использовать значение по умолчанию, вы можете использовать S tring.IsEmpty or String.IsNullOrWhitespace` для их обработки, например:

v=> String.NullOrWhitespace(v)?InputSetType.Unknown:Enum.Parse(typeof(InputSetType),v)
0 голосов
/ 14 октября 2019

Вероятно, это исключение вызвано неверными данными в базе данных - данными, которых нет в перечислении, нулевой, пустой строке и т. Д. Эта ошибка распространена в Enum.Parse(), поэтому я думаю, что это связано с этим методом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...