我已经使用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));
我有什么办法可以摆脱这个警告?
答案 0 :(得分:0)
幸运的是,从EF Core 2.2迁移到EF Core 3.0解决了该问题。 我现在找不到它,但是在他们的GitHub问题跟踪器上,他们提到了该问题已在新版本中修复。
对于所有面临相同问题的人-将EF Core更新到较新的版本应该会有所帮助。如果无法通过某种方式更新程序包,则可以尝试更改数据库上下文以在客户端评估发生时显式引发异常并分别面对每个问题。