Eu tenho esta propriedade de entidade, que é armazenada no banco de dados como CSV ou nulo:
public ICollection<string> Names { get; } = new List<string>();
Eu tenho esta configuração:
modelBuilder
.Entity<Person>()
.Property(e => e.Names)
.HasConversion(
x => x.Any() ? string.Join(',', x) : null, // this works
x => (x ?? "").Split(',', StringSplitOptions.None).ToList(), // this fails
new ValueComparer<ICollection<string>>(
equalsExpression: (c1, c2) => c1!.SequenceEqual(c2!),
hashCodeExpression: c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode(StringComparison.Ordinal))),
snapshotExpression: c => c.ToHashSet())
.IsRequired(false);
Isso traduz com êxito uma coleção vazia em um banco de dados NULL. Mas um banco de dados NULL é convertido em ac# null
em vez de uma coleção vazia.
Onde está o meu erro?
(Não posso alterar a nulidade da propriedade ou remodelar o banco de dados; ambos estão fora do meu controle.)
De acordo com a documentação : "Um valor nulo nunca será passado para um conversor de valor. Um nulo em uma coluna do banco de dados é sempre nulo na instância da entidade e vice-versa."
Acho que a solução mais fácil é mapear manualmente.
Uma solução alternativa:
Infelizmente, isso converte uma coleção vazia no código em uma string vazia
""
no banco de dados, em vez deNULL
.Se você deseja esse comportamento, vote positivamente neste problema de repositório .