【问题标题】:Entity Framework Core - Has Conversion - Support Null ValuesEntity Framework Core - 有转换 - 支持空值
【发布时间】:2019-05-13 08:58:00
【问题描述】:

我有一个带有通知电子邮件属性的 EF 模型。通知电子邮件以字符串形式保存在数据库中,以“;”分隔。我添加了一个转换来检索模型中的 ICollection 数据。除了一件事之外,这很好用:当字符串为空时,集合也为空,我想将其转换为空集合。可能吗?

//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 忽略它。

【问题讨论】:

  • 将数据存储为分号分隔的项目是一个糟糕的主意。做一张桌子。
  • @DavidG 你能解释一下原因吗?
  • 首先,您不需要像这里那样糟糕的转换器。有很多原因。
  • @DavidG 你知道的任何其他原因真的有帮助吗?
  • @TalHumy 其他一些原因:服务器端过滤不可能(或很难做到)。无法单独添加/删除/更新项目 - 必须更新整个项目。等等。但是要回答您的具体问题,到目前为止,EF Core 值转换器并不需要null 值 - 假设null 始终转换为null。由于无论如何您都不能在 L2E 查询中使用此类集合,因此您可以使用显式支持字段和特殊属性 getter 在对象级别处理它。

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


【解决方案1】:

目前是不可能的:

https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions#configuring-a-value-converter

永远不会将空值传递给值转换器。这使得转换的实现更容易,并允许它们在可为空和不可为空的属性之间共享。

这并不优雅,但您可以使用支持字段:

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);
    }
}

注意:在where中,空列表不会被null翻译,而是被空字符串翻译。

编辑:此功能在 EF Core 6 中可用,但存在错误。 见this comment

对于关注此问题的任何人:在执行将数据库中的空值转换为代码中的非空值或反之亦然的查询时,会出现重大问题。因此,我们将此功能标记为 EF Core 6.0 的内部功能。您仍然可以使用它,但您会收到编译器警告。可以使用#pragma 禁用警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2019-03-28
    • 2019-08-16
    • 2021-04-23
    • 2020-10-12
    • 2019-04-02
    • 2022-08-02
    相关资源
    最近更新 更多