我在数据库中有一个包含应用程序用户的表。用户名是唯一的,因此我在表中有一个唯一的约束。
我正在做探测,一个尝试为两个用户使用相同的用户名。当错误发生时,我捕获异常“Eception”,我可以看到catched异常是System.Data.Entity.Infraestructure.DbUpdateConcurrencyException,内部异常是System.Data.OptimisticConcurrencyException。
然后我抓住了DbUpdateConcurrencyException,这是一个很好的异常,就是OptimisticConcurrencyException,所以我也尝试捕获这个异常。
如果我尝试在DbUpdateConcurrencyException之前捕获OptimisticConcurrencyException,而不是catch,则捕获DbUpdateConcurrencyException。
所以我不知道如何捕获SqlException,因为我想捕获Sql Server的错误,以获取代码。
感谢。
答案 0 :(得分:1)
你试过了吗?
try
{
}
catch (SqlException ex)
{
}
答案 1 :(得分:1)
你无法处理'内部例外'。您需要检查catch
处理程序中抛出的实际异常,如果无法处理它,请重新启动它。例如:
try
{
}
catch (DbUpdateConcurrencyException ex)
{
if (CanHandleException(ex))
{
// do what you have to do to handle the exception
}
else
{
throw; // can't handle this exception - just let it bubble up
}
}
在方法CanHandleException
中,您将编写逻辑,确定您是否可以处理此异常并执行一些有意义的操作(可能重试该操作)。您可以通过检查异常的属性(message,InnerException,...)
答案 2 :(得分:0)
您可以使用
处理它var objContext = ((IObjectContextAdapter)ctx).ObjectContext;
var entry = dbUpdateConcurrencyException.Entries.Single();
if (entry.State == EntityState.Deleted)
{
entry.State = EntityState.Detached;
}
else
{
entry.OriginalValues.SetValues(entry.GetDatabaseValues());
objContext.Refresh(RefreshMode.ClientWins,dbUpdateConcurrencyException.Entries.Select(e => e.Entity));
}