我有这个实体属性,它以 CSV 或 null 的形式存储在数据库中:
public ICollection<string> Names { get; } = new List<string>();
我有这样的配置:
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);
这成功地将空集合转换为数据库 NULL。但数据库 NULL 会转换为 ac#null
而不是空集合。
我的错误在哪里?
(我无法更改属性的可为空性或重构数据库;两者都超出了我的控制范围。)
根据文档:“空值永远不会传递给值转换器。数据库列中的空值始终是实体实例中的空值,反之亦然。”
我想最简单的解决方案就是手动映射。
解决方法:
不幸的是,这会将代码中的空集合转换为
""
数据库中的空字符串,而不是NULL
.如果您想要这种行为,请投票支持此回购问题。