编辑3

要明确一点,在这一点上:

1)我在输出中看到SQL异常,但它不是“捕获”任何异常...代码正在正常执行,我知道存在异常的唯一原因是我正在查看输出窗口。实体似乎可以用于初始读取(它返回了预期的数据)。

2)当我尝试这样做时,实体挂起。SaveChanges,但我似乎无法“捕获”任何异常...它只是挂起。不知道为什么吗?

原始帖子
我有一个C#控制台应用程序,使用.Net 4.5和Entity Framework 6.1.3

我能够读取数据库,所以我知道连接字符串和凭据正确。我的问题是,当我执行DbContext.SaveChanges()时,应用程序会挂起,并且如果我将光标悬停在Visual Studio中的SaveChanges方法上,则弹出窗口会显示它已抛出:

System.Data.Entity.InfrastructureDbUpdateException
System.Data.Entity.InfrastructureConcurrencyException
System.Data.Entity.Validation.DbEntityValidationException
System.NoSupportedException
System.ObjectDisposedException
System.InvalidOperationException


我试图按照下面的代码捕获其中的一些,但是在阅读其他SO文章时,似乎无法捕获这些异常?有人知道如何抓住这些吗?

请注意,在执行这些SaveChanges之前,我已经能够从另一张表读取信息,因此我知道我的凭据和连接字符串有效,并且我具有连通性,并且实体似乎至少在起作用。

还有一条信息:几天前这曾经起作用...我只是不知道该怎么做才能“破坏它”!在另一台服务器上使用SQL Server。

连接字符串为:

<add name="DataContext"
     connectionString="data source=1.2.3.4;initial catalog=db1;user id=user1;password=pwd1;MultipleActiveResultSets=True;App=EntityFramework"
     providerName="System.Data.SqlClient" />


所以最重要的是我的应用程序在执行.SaveChanges时挂起,我不知道为什么...

try
{
    return _context.SaveChanges();
}
catch (DbUpdateException e)
{
    Console.WriteLine(e.ToString());
    Console.ReadLine();
    return 0;
}
catch (DbEntityValidationException dbEx) // added for debug.
{
    foreach (var validationErrors in dbEx.EntityValidationErrors)
    {
        foreach (var validationError in validationErrors.ValidationErrors)
        {
            Trace.TraceInformation("Property: {0} Error: {1}",
                                   validationError.PropertyName,
                                   validationError.ErrorMessage);
            Console.WriteLine(string.Format("Property: {0} Error: {1}",
                                            validationError.PropertyName,
                                            validationError.ErrorMessage));
            Console.ReadLine();
        }
    }

    return 0;
}
catch (Exception e)
{
    Console.WriteLine(e.ToString());
    Console.ReadLine();
    return 0;
}


编辑1

确认异常不是真实的。它们是ReSharper或MS Productivity工具提供的弹出窗口,向我显示可能的异常……我想。

因此,我只能挂在.SaveChanges上,无法知道为什么?

编辑2

我确实看到在第一次数据库读取中,即使读取有效,调试输出窗口也会显示异常!请注意,这也在try / catch(Catch (Exception e))块内,并且不会捕获异常!


  类型“ System.Data.SqlClient.SqlException”的第一次机会异常发生在System.Data.dll中
  EntityFramework.dll中发生类型为'System.Data.Entity.Core.EntityCommandExecutionException'的第一次机会异常
  类型'System.Data.Entity.Core.EntityCommandExecutionException'的第一次机会异常发生在EntityFramework.SqlServer.dll中

最佳答案

您的问题是在e.ToString()中。您要检查e.Message属性。您还可以检查是否还有e.InnerException。

catch (Exception e)
{
    if (e.InnerException != null) {
       Console.WriteLine(e.InnerException);
    } else {
       Console.WriteLine(e.Message);
    }

    Console.ReadLine();
    return 0;

}

关于c# - 排除SqlException故障,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33846209/

10-16 16:55