有一个向数据库添加信息的功能。该函数可以向数据库发送请求,以初步检查是否可以添加实体,或者只是捕获异常。
第一个选项(检查数据库中是否有这样的用户名,不要捕获异常):
public virtual async Task<ServiceResult> CreateAsync(User user)
{
var errors = Validation(user);
if (errors.Count > 0)
{
return new ServiceResult(false, errors);
}
if (await Queryable.AnyAsync(u => u.UserName == user.UserName))
{
return new ServiceResult(false, "This username already exists.");
}
try
{
await DbContext.AddAsync(user);
await DbContext.SaveChangesAsync();
}
catch (Exception ex)
{
return new ServiceResult(false, ex.Message);
}
return new ServiceResult(true);
}
第二个选项(我们不检查数据库中是否有这样的用户名,我们捕获异常):
public virtual async Task<ServiceResult> CreateAsync(User user)
{
var errors = Validation(user);
if (errors.Count > 0)
{
return new ServiceResult(false, errors);
}
try
{
await DbContext.AddAsync(user);
await DbContext.SaveChangesAsync();
}
catch (Exception ex)
{
return new ServiceResult(false, ex.Message);
}
return new ServiceResult(true);
}
什么是最好的方法?
必须始终处理使用数据库时的异常,因为。异常的原因不仅可能是您尝试添加的条目的存在,还可能是许多其他因素,例如通信通道中断、长时间阻塞和超时等。等等 此外,在检查记录是否存在和插入记录之间有足够的时间,以便在这些事件之间另一个客户端有时间执行其插入,即使没有其他外部因素,您也会得到相同的异常。
在 SQL 中,您可以使用安全的插入语句
MERGE代替INSERT. EF 还提供了AddOrUpdate方法形式的安全添加机制,但是我没有看它内部是如何工作的,而且它没有 MERGE 灵活,因为 只实现了使用 MERGE 的一种可能性。例如,使用 MERGE,如果记录已经存在,我什么也做不了。您还可以阅读有关异常的更详细答案: https ://ru.stackoverflow.com/a/140607/242690