【发布时间】:2018-06-03 04:22:22
【问题描述】:
我正在尝试制定一个解决方案来检查是否有任何不应重复的字段添加了会违反此规则的行。我正在使用存储库模式,所以我想在存储库中创建一个方法来执行此操作。
在这个例子中,我试图添加一个公司,在控制器中添加它之前,它会在 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;
}
我面临的问题是尝试返回错误,以便控制器可以将错误发送给客户端。显而易见的解决方案是只发送异常而不是返回 true。但是,如果我调用它只是为了说明是否有一家公司具有这些参数,那么我不希望发送异常,我只想在两种情况下都使用布尔值。
精简的问题:在这种情况下创建另一个返回异常而不是布尔值的方法 CheckDuplication() 是不好的做法吗?如果是,那么在 Entity Framework Core 中保存到数据库之前检查重复字段的正确方法是什么?
【问题讨论】:
-
使用更复杂的返回对象来保存所需的信息。类似于 ModelState 的使用方式。
-
我倾向于同意@Nkosi。为什么不只返回一个模型,其中有两个属性,一个是 IEnumerable
或 IList (对您来说有意义的),另一个是指示存在的布尔值? [为清楚起见进行了编辑。] -
PS 我不认为将存在检查和验证检查分开存在本质上的问题。拥有一个只返回布尔值的 Exists() 方法和某种抛出异常或返回某种可枚举异常的 Validate() 方法是很好的。如果将这两件事合并到一个模型中没有意义,那就不要这样做。坚持你原来的计划。它的缺点是每次向表中添加新字段时都需要维护两种方法。也有可能将这一切整合到一种方法中以返回一个对象实际上会使其变得更笨重。
-
mmm... 为什么不放 ON DB(如果您使用的是 SQL 数据库 ..不是如果您使用的是 MongDB ..)唯一索引或一些检查约束? ..所以当你尝试保存它时 ..EF 为你做检查?
-
认为这两种方法将是与 validate 方法一起使用的方式,该方法返回列表,异常被解析到控制器中的 ModelState。我已经在使用唯一约束,但我在互联网上找到的唯一方法是捕获异常,然后大量转换为不同的对象和笨重的代码,我想要一个更简洁的解决方案。
标签: c# asp.net entity-framework asp.net-web-api entity-framework-core