实体框架核心存储库模式 - 重复检查

时间:2017-12-20 15:01:26

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

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

在这个例子中,我试图在添加它之前在控制器中添加一个公司,它在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;
    }

我面临的问题是尝试返回错误,以便控制器可以将错误发送给客户端。显而易见的解决方案是发送Exceptions而不是返回true。但是,如果我打电话给这个只是说有一个公司有这些参数,那么我不想要发送异常,我只想在两种情况下都有一个布尔值。

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

1 个答案:

答案 0 :(得分:1)

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

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