【问题标题】:Unable to catch DbUpdateConcurrencyException and throw UserFriendlyException无法捕获 DbUpdateConcurrencyException 并抛出 UserFriendlyException
【发布时间】:2019-04-28 05:51:21
【问题描述】:

我正在使用带有代码优先实体框架和 MVC 5 的 ASP.NET 样板。 我想处理并发。在Update 方法中,我在我的实体中为RowVersion 字段添加了Timestamp 数据注释。

在我的实体的管理器和Update 操作中,我试图捕获DbUpdateConcurrencyException 异常并抛出UserFriendlyException 但由于UpdateAsync 是异步的,我不知道在哪里处理异常。

我应该在哪里处理这个异常以便用户友好并且不会看到内部服务器错误?

public abstract class BaseFullAuditedEntity : FullAuditedEntity<Guid>
{
    [Timestamp]
    public byte[] RowVersion { get; set; }
}

public class Branch : BaseFullAuditedEntity
{
    public string Name { get; set; }
}

经理代码:

public interface IBranchManager : IDomainService
{
    Task<Branch> Update(Branch branch, byte[] RowVersion);
}

public class BranchManager : DomainService, IBranchManager
{
    private IRepository<Branch, Guid> _branchRepository { get; }

    public async Task<Branch> Update(Branch branch, byte[] RowVersion)
    {
        try
        {
            return await _branchRepository.UpdateAsync(branch);
        }
        catch (DbUpdateConcurrencyException ex)
        {
            throw new UserFriendlyException("Update Concurrency Happened");
        }
    }
}

【问题讨论】:

  • 是的,我在您回答我之前应用了您建议的相同解决方案,正是我写的内容让我现在更加确定

标签: c# entity-framework asp.net-mvc-5 aspnetboilerplate optimistic-concurrency


【解决方案1】:

UpdateAsync(branch) 仅将 branch 添加到上下文中。

注入IUnitOfWorkManagerawaitSaveChangesAsync()

try
{
    await _branchRepository.UpdateAsync(branch);
    await _unitOfWorkManager.Current.SaveChangesAsync(); // Add this
    return branch;
}
catch (DbUpdateConcurrencyException ex)
{
    throw new UserFriendlyException("Update Concurrency Happened");
}

或者,在 DbContext 中覆盖 SaveChangesSaveChangesAsync 以捕获所有实体:

public override int SaveChanges()
{
    try
    {
        return base.SaveChanges();
    }
    catch (DbUpdateConcurrencyException ex)
    {
        throw new UserFriendlyException("Update Concurrency Happened");
    }
}

public override async Task<int> SaveChangesAsync()
{
    try
    {
        return await base.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException ex)
    {
        throw new UserFriendlyException("Update Concurrency Happened");
    }
}

【讨论】:

  • 解决方案看起来很有希望......你需要SaveChanges()
【解决方案2】:

尝试捕获作为聚合异常... (有时,真正的异常正在被包装。)

try
{
    // code...
}
catch (Exception ex)
{
    if (ex is AggregateException)
    {
        var exMsg = FlattenAggregate((AggregateException)ex);
        throw new UserFriendlyException(exMsg );
    }

    throw;
}

public static string FlattenAggregate(AggregateException aggregateException)
{
    var sbErr = new StringBuilder();
    var exceptions = aggregateException.Flatten();
    foreach (var exception in exceptions.InnerExceptions)
    {
        sbErr.AppendLine(exception.ToString());
    }

    return sbErr.ToString();
}

【讨论】:

    猜你喜欢
    • 2021-03-19
    • 2014-04-26
    • 2011-04-05
    • 2015-09-23
    • 2013-08-02
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多