【问题标题】:EF Core: Can I map nullable SQL type to non-nullable value type in my Entity?EF Core:我可以在我的实体中将可为空的 SQL 类型映射到不可为空的值类型吗?
【发布时间】:2021-03-03 15:57:13
【问题描述】:

我有一个映射到以下实体的 SQL VIEW:

public class MyView {
   public string Name {get; set;}
   public int Count {get; set;}
}

我像dbContext.MyView.ToArrayAsync()dbContext.MyView.Where(e => e.Count > 0) 等使用它。

视图在生产中的 Count 列中返回 NULL,并且在评估查询时我得到 NullReferenceExeption。

我能否配置映射,以便将 NULL 值映射到 default(int)0

我尝试使用可为空的支持字段private int? _count,但仍然出现异常。要求是,除了实体本身或映射之外,我不想更改 SQL 视图或我的代码。

【问题讨论】:

  • 这能回答你的问题吗? Mapping NULLs to type default
  • @MindSwipe:不,因为它会破坏使用该列的查询,例如dbContext.MyView.Where(e => e.Count > 0)。我不能在查询中使用 Ignored 属性。此外,它没有回答这个问题。这是使用不同技术的解决方法,但不是答案
  • 请把票数拿回来,还为时过早 ;)
  • 您已尝试使用可为空的支持 field,但 AFAIK EF 仅映射到 properties。此外,除了将 null 映射到 default(int) 之外,我看不到支持字段如何以任何其他方式破坏查询
  • 我使用过HasField("_count") - 所以 EF 确实映射到字段 :) 但我也尝试使用您发布的“烘焙属性”解决方法。它建议忽略原始属性。一旦忽略它,就不能使用它查询表达式,因为 EF Core 现在不知道如何翻译它(例如在 WHERE 条件下)。忽略的属性无法转换为 SQL

标签: c# sql-server entity-framework-core ef-core-5.0


【解决方案1】:

这似乎是一个错误处理问题,而不是映射问题。 我看到有几种方法可以解决这个问题:

  1. 是使用 expression bodied memberint 设置为 0 - 我不认为它是您的最佳选择,因为同样,问题与错误处理有关。

  2. 我的建议是使用FirstOrDefualt().ToList()。如果没有找到记录,它将返回 null / count of 0,这样您就可以进行相应的查询。

IE:

var record = dbContext.MyView.Where(e => e.Count > 0).FirstOrDefault();
var found = record != null ? record : 0;

或者:

var records = dbContext.MyView.Where(e => e.Count > 0).ToList();
var found = records.Count() > 0 ? records : new List<T>();

这将为您提供一种处理空错误的可读方法。然后,如果您通过了检查,您就可以带上其余的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 2021-04-17
    • 1970-01-01
    • 2020-04-21
    • 2011-02-15
    • 1970-01-01
    • 2010-10-21
    相关资源
    最近更新 更多