【问题标题】:EF/ASP Core handle string property as NULL instead of emptyEF/ASP Core 将字符串属性处理为 NULL 而不是空
【发布时间】:2018-03-17 01:08:12
【问题描述】:

我注意到我的对象的所有在客户端留空的属性在绑定时在服务器端都保持为空。

这最终会在稍后执行一些 LINQ Where 条件时引发空对象异常,因为字符串属性为空而不是空。

我已经尝试使用 context.DisplayMetadata.ConvertEmptyStringToNull = false 添加一个 CustomMetadataProvider;在这里讨论ModelBinding,但没有运气。

 providers = await dbData.Providers.AsNoTracking().
                OrderBy(order)
                .Where(q =>
            (query.search == null ||
            q.No.ToString().Contains(query.search) ||
            q.Name.Contains(query.search) ||
            q.Address.Contains(query.search) ||
            q.PhoneFax.Contains(phoneQuery) ||
            q.PhoneNumber.Contains(phoneQuery) ||
            q.PhoneTollFree.Contains(phoneQuery)) && (query.getDeleted || !q.Deleted))
            .Skip((query.limit * (query.page - 1))).Take(query.limit)
                .AsNoTracking().ToArrayAsync();

【问题讨论】:

    标签: asp.net-core entity-framework-core asp.net-core-webapi


    【解决方案1】:

    字符串应该是不可为空的,或者您应该处理空的情况。在您的数据库中,支持列将设置为 NULL 或 NOT NULL,具体取决于您是否将 [Require] 属性添加到属性中。如果不需要,那么 NULL 是一个完全可以接受的值,甚至可以说是 最佳 值,因为它明确表示“未设置”而不是“设置为空字符串”。

    长短,如果你有一个可以为空的属性要查询,请检查空值首先

    (q.Name != null && q.Name.Contains(query.Search)) ||
    

    【讨论】:

    • 我知道这个解决方案,但我想知道为什么使用以前的 Web API 和 EF 我不必处理这个问题。
    • q.Name 之类的东西上调用Contains 如果它为空总是一个问题。这是一个简单的语言级异常,无法解决。如果您之前没有遇到问题,那么唯一的解释是这些列在之前的迭代中都不是 NULL。
    猜你喜欢
    • 2014-04-02
    • 2012-07-04
    • 1970-01-01
    • 2019-05-13
    • 2021-11-04
    • 1970-01-01
    • 2012-01-25
    • 2018-02-17
    • 1970-01-01
    相关资源
    最近更新 更多