public async Task<ActionResult> Index()
{
var service = new CoreServiceFactory().GetImpersonatingService();
try
{
var data = new Impersonation()
{
ImpersonatingId = "dac733c3-01ad-447b-b0df-3a7c21fef90b",
UserId = "dac733c3-01ad-447b-b0df-3a7c21fef90b"
};
var imp = await service.Add(data);
}catch(Exception ex) { throw ex; }
return View();
}
上面是我的控制器动作方法之一。当插入成功时,这很好用。如果数据已存在于数据库中(唯一约束),则此操作将失败。因此,当我故意尝试使其失败时(我在数据库中手动添加相同的记录,然后尝试通过此操作方法再次添加它),操作方法进入循环或其他东西,异常永远不会抛出,chrome让我向我展示加载图标,看起来它进入了一些死锁状态。有人可以帮我理解为什么它会在抛出异常时进入死锁状态,我该如何处理呢?
public async Task<Impersonation> Add(Impersonation t)
{
if (ValidateData(t))
{
using (var uow = GetUnitOfWork())
{
var r = GetRepository(uow);
var item = r.Add(t);
try
{
var ret = await uow.Save();
if (ret > 0)
{
return item;
}
else
{
return null;
}
}
catch (Exception ex)
{
throw ex;
}
}
}
else
{
throw new ValidationException(null, "error");
}
}
public class BaseUnitOfWork : IUnitOfWork
{
public DbContext _Context { get; private set; }
public BaseUnitOfWork(DbContext context)
{
this._Context = context;
}
public async Task<int> Save()
{
try
{
var ret = await this._Context.SaveChangesAsync();
return ret;
}catch(Exception ex)
{
throw ex;
}
}
}
答案 0 :(得分:0)
这是我的建议:在uow.Save中,在catch块中记录错误并返回零(不要抛出任何异常)。
public class BaseUnitOfWork : IUnitOfWork
{
public DbContext _Context { get; private set; }
public BaseUnitOfWork(DbContext context)
{
this._Context = context;
}
public async Task<int> Save()
{
try
{
var ret = await this._Context.SaveChangesAsync();
return ret;
}catch(Exception ex)
{
// log the error here
return 0;
}
}
}
我不确定在添加服务中返回null是否是个好主意,您可能需要以不同的方式处理它。