Строковое свойство EF/ASP Core обрабатывается как NULL вместо пустого

Я заметил, что все свойства моего объекта, которые остаются пустыми на стороне клиента, остаются нулевыми на стороне сервера при привязке.

Это в конечном итоге вызовет исключение нулевого объекта при выполнении некоторого условия LINQ Where позже, поскольку строковое свойство имеет значение null, а не пустое.

Я уже пытаюсь добавить CustomMetadataProvider с context.DisplayMetadata.ConvertEmptyStringToNull = false; как обсудите здесь string?rq=1">ModelBinding, но безуспешно.

 providers = await dbData.Providers.AsNoTracking().
                OrderBy(order)
                .Where(q =>
            (query.search == null ||
            q.No.ToString().Contains(query.search) ||
            q.Name.Contains(query.search) ||
            q.Address.Contains(query.search) ||
            q.PhoneFax.Contains(phoneQuery) ||
            q.PhoneNumber.Contains(phoneQuery) ||
            q.PhoneTollFree.Contains(phoneQuery)) && (query.getDeleted || !q.Deleted))
            .Skip((query.limit * (query.page - 1))).Take(query.limit)
                .AsNoTracking().ToArrayAsync();

person Pilouk    schedule 16.03.2018    source источник


Ответы (1)


Строка должна быть либо не допускающей значение NULL, либо вы должны обрабатывать нулевой регистр. В вашей базе данных вспомогательный столбец будет установлен либо как NULL, либо как NOT NULL, в зависимости от того, добавляете ли вы атрибут [Require] к свойству или нет. Если это не требуется, то NULL является вполне приемлемым значением и даже, возможно, наилучшим значением, поскольку оно явно указывает «не задано», а не «установлено в пустую строку».

Короче говоря, если у вас есть свойство, допускающее значение NULL, к которому вы хотите запросить, проверьте наличие нулевых значений сначала:

(q.Name != null && q.Name.Contains(query.Search)) ||
person Chris Pratt    schedule 16.03.2018
comment
Я знал это решение, но мне интересно, почему с предыдущим веб-API и EF мне не пришлось с этим справляться. - person Pilouk; 16.03.2018
comment
Вызов Contains для чего-то вроде q.Name, если он нулевой, всегда был проблемой. Это простое исключение на уровне языка, которое невозможно обойти. Если раньше у вас не было проблем, то единственное объяснение состоит в том, что все эти столбцы были NOT NULL в предыдущей итерации. - person Chris Pratt; 16.03.2018