EF Core ValueObject 比较无法翻译,将在本地评估

EF Core ValueObject comparison could not be translated and will be evaluated locally

我使用 DDD 和 EF Core 设计了我的域。

假设我的实体如下所示:

public sealed class ArticleEntity
{
    private ArticleEntity() { }

    public ArticleId Id { get; private set; }
    public string Name { get; private set; }
}

我的 ArticleId ValueObject 如下所示:

public sealed class ArticleId
{
    public ArticleId(int value)
    {
        Value = value;
    }

    public int Value { get; }

    public static bool operator ==(ArticleId obj1, ArticleId obj2)
    {
        return (obj1 is null && obj2 is null)
            || (!(obj1 is null) && obj1.Equals(obj2));
    }

    public static bool operator !=(ArticleId obj1, ArticleId obj2)
    {
        return !(obj1 == obj2);
    }

    public override string ToString()
    {
        return base.ToString();
    }

    public override int GetHashCode()
    {
        return base.GetHashCode();
    }

    public override bool Equals(object obj)
    {
        return base.Equals(obj);
    }
}

我使用这样的查询从存储库获取数据:

public ArticleEntity Get(ArticleId id)
{
    return _context.Articles
        .SingleOrDefault(a => a.Id == id);
}

当我浏览日志时,我看到这样的条目:

20500|WARN|Microsoft.EntityFrameworkCore.Query|The LINQ expression 'where ([a].Id == __id_0) ' could not be translated and will be evaluated locally.

我已经为 ArticleId 参数设置了一个转换,像这样:

builder.Property(a => a.Id)
    .HasConversion(
         id => id.Value,
         value => new ArticleId(value));

我能做些什么来消除这个警告吗?

幸运的是,从 EF Core 2.2 迁移到 EF Core 3.0 解决了这个问题。 我现在找不到它,但在他们的 GitHub 问题跟踪器上,他们提到该问题已在新版本中修复。

对于所有面临相同问题的人 - 将 EF Core 更新到较新版本应该会有所帮助。如果您无法以某种方式更新包,您可以尝试更改您的数据库上下文以在客户端评估发生时显式抛出异常并分别面对每个问题。