EF核心ValueObject比较无法翻译,将在本地进行评估



我使用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);
}
}

我使用这样的查询从Repository获取数据:

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更新到新版本应该会有所帮助。如果您无法以某种方式更新包,您可以尝试更改DB上下文,以便在客户端评估发生时显式抛出异常,并分别面对每个问题。

相关内容

  • 没有找到相关文章

最新更新