繁体   English   中英

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|LINQ 表达式“where ([a].Id == __id_0)”无法翻译,将在本地进行评估。

我已经为 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 更新到较新版本应该会有所帮助。 如果不知何故您无法更新 package 您可以尝试更改数据库上下文以在发生客户端评估时显式抛出异常并分别面对每个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM