A versão do Entity Framework Core é 8.0. Aqui está meu modelo.
public class Item
{
[Key] public long ItemId { get; set; }
public string KeyNumYear { get; set; }
...
}
No banco de dados, a coluna intKeyNumYear
é anulável .
Temos uma linha com valor nulo em seu KeyNumYear
campo. Ao usar o EfCore para consultar essa linha, recebo o erro abaixo.
System.Data.SqlTypes.SqlNullValueException: 'Dados são Nulos. Este método ou propriedade não pode ser chamado em valores Nulos.'
Mas se eu alterá-lo para public string? KeyNumYear { get; set; }
, ele será executado com sucesso.
Estou confuso porque acho que string
já é anulável em C#. Por que tenho que marcá-lo como string?
no Entity Framework Core?
O ideal é que, se a coluna do banco de dados for um int anulável, a propriedade na entidade deve ser:
O motivo pelo qual
string
isso não funciona é que o EF detectará a conversão de tipo e interpretará a necessidade de astring
vs. astring?
e precisará aplicar uma conversão, especificamente aToString()
.#null.ToString()
é inválido, onde se declarado como uma string anulável, o EF saberá verificar #null primeiro antes de aplicar oToString()
.string
é um tipo de referência, não especificamente um tipo anulável. Antes do .Net Core 6, os tipos de referência eram interpretados como anuláveis por padrão. Com o .Net 6, eles introduziram tipos de referência anuláveis explícitos.