实体框架核心-具有转换-支持空值

时间:2019-05-13 08:58:01

标签: entity-framework asp.net-core entity-framework-core

我有一个带有通知电子邮件属性的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忽略了它。

1 个答案:

答案 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,而是被翻译为空字符串。