c# - Entity Framework 核心存储库模式 - 重复检查

标签 c# asp.net entity-framework asp.net-web-api entity-framework-core

我正在尝试制定一个解决方案来检查是否有任何不应该重复的字段添加了一行会违反此规则。我正在使用存储库模式,所以我想在存储库中创建一个方法来执行此操作。

在这个例子中,我试图在 Controller 中添加一个公司,在添加之前它在 CompanyRespository 中调用这个方法:

    public bool Exists(Company company, bool ignoreId)
    {
        if (!ignoreId)
        {
            if (context.Companies.Any(c => c.Id == company.Id)) return true;
        }
        if (context.Companies.Any(c => c.TextId == company.TextId)) return true;
        if (context.Companies.Any(c => c.Email == company.Email)) return true;
        if (context.Companies.Any(c => c.PhoneNumber == company.PhoneNumber)) return true;
        return false;
    }

我面临的问题是尝试返回错误,以便 Controller 可以将错误发送给客户端。显而易见的解决方案是只发送异常而不是返回 true。但是,如果我调用它只是为了说明是否有一家公司具有这些参数,那么我不想发送异常,我只想在这两种情况下都使用一个 bool 值。

缩减问题:在这种情况下创建另一个返回异常而不是 bool 值的方法 CheckDuplication() 是否是不好的做法?如果是,那么在 Entity Framework Core 中保存到数据库之前检查重复字段的正确方法是什么?

最佳答案

有一个单独的验证检查会很好,并且允许您编写一个更加用户友好的应用程序。但是,不要错误地依赖此检查来确保数据完整性。多线程将是引起关注的主要原因。 Sql DB 可以更好地保护数据完整性,因此我建议为每个字段定义唯一约束(例如查看 Setting unique Constraint with fluent API? )。当然,这会引发 EF 异常,但可以捕获并检查这些异常,以确定它们是否违反了约束。这样,如果需要,您仍然可以返回一个 bool 值。

作为旁注,使用 OR(||) 可以更有效地编写 Exits 方法,这样您就不必触发那么多的 sql 查询。

关于c# - Entity Framework 核心存储库模式 - 重复检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47908889/

相关文章:

c# - 如何根据表的最大标识键使用 Entity Framework 在 MVC 中保存数据时生成唯一编号?

c# - 在当前 docx 文件上执行 word 加载项

c# - 如何将配置输出设置到特殊文件夹(LocalApplicationData)?

asp.net - WCF 的 REST 资源管理器

asp.net - 使用 Informix 进行 SqlBulkCopy

c# - 对 EF Code First 中的两个相同表使用相同类型

c# - 为什么等待从异步方法返回的任务被阻塞?

c# - 如何将 TypeConverter 与 ConfigurationSection 一起使用?

asp.net mvc 3 Html.GetUnobtrusiveValidationAttributes 和嵌套模型

c# - 为什么我在 ApplicationUser 中的自定义对象属性为空?