我有一个带有通知电子邮件属性的EF模型。通知电子邮件将以字符串形式存储在数据库中,并以“;”分隔。我添加了一个转换以在模型中以ICollection的形式检索数据。除一件事外,此方法运行良好:当字符串为null时,集合也为null,我想将其转换为空集合。可能吗?
//This is my code
entity.Property(e => e.NotificationEmails)
.HasConversion(
v => string.Join(",", v.Select(s => s.Trim())),
v => v.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries));
我尝试添加String.IsNullOrEmpty(v),但EF忽略了它。
答案 0 :(得分:0)
当前不可能:
https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions#configuring-a-value-converter
空值将永远不会传递给值转换器。这使转换的实现更加容易,并允许它们在可为空和不可为空的属性之间共享。
但也许在EF Core 5中: https://github.com/dotnet/efcore/issues/13850
这不是很优雅,但是您可以使用一个后备字段:
public class Notification
{
private List<string> _emails = new List<string>();
public List<string> Emails
{
get => _emails;
set => _emails = value ?? new List<string>();
}
}
public class NotificationContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Notification>().Property(d => d.Emails).HasConversion(
v => string.Join(",", v.Select(s => s.Trim())),
v => v.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList()
);
modelBuilder.Entity<Notification>()
.Property(b => b.Emails)
.HasField("_emails")
.UsePropertyAccessMode(PropertyAccessMode.Property);
}
}
注意:在此,空列表不会被翻译为null,而是被翻译为空字符串。