实体框架存在问题

时间:2012-11-28 16:07:05

标签: c# entity-framework visual-studio-2012

我在使用EntityFramework时遇到问题。虽然下面的代码和平在我的PC上工作正常,当它被传输到VPS(预先安装好所有东西)时,它会给我一个未处理的异常:System.NullReferenceException:对象引用未设置为对象的实例,但是消息框应该抓住这个并没有出现。有什么建议吗?

提前谢谢。

        var cc = new CopierContext();
        try
        {
            MessageBox.Show(cc.Database.Connection.ConnectionString.ToString());

            var matchingProviders2 = cc.Providers.Where(prov => prov.Login == "batman");
        }
        catch (Exception e)
        {
            MessageBox.Show(e.InnerException.Message);
        }

更新

我终于找到了问题的核心。原因是:我在VPS上使用.NET 4,而应用程序是使用.NET 4.5开发的。安装后者可以解决所有问题。谢谢你的帮助。

4 个答案:

答案 0 :(得分:1)

我不知道你是如何在你的VPS上运行它的,但是如果它没有在交互式用户帐户下启动,你的消息框就不会显示出来。

答案 1 :(得分:1)

来自Exception.InnerException Property

上的文档
  

InnerException属性返回与传入的值相同的值   构造函数,或空引用

由于您正在捕获任何旧的异常catch (Exception e),因此抛出的异常很可能不是您期望的异常,并且没有InnerException。这意味着你的catch块可能会引发异常。

您可以采取多种措施。

  1. 除了顶级异常处理程序之外,不要捕获System.Exception异常。只捕获您知道如何处理的异常。这导致......
  2. 设置顶级异常处理程序
  3. 最后,在记录或显示异常消息时,至少要确保在尝试使用它之前有一个内部异常。

    MessageBox.Show( (e.InnerException != null ? e.InnerException : e).Message );

答案 2 :(得分:0)

不要使用MessageBox,因为它是一项服务;将它们记录到磁盘上,以便您可以回忆它们,或者自动将它们发送给您,以便您及时了解发生的问题。

您还需要将e.InnerException.StackTrace添加到日志中。

答案 3 :(得分:0)

我敢打赌,你没有配置(或没有正确配置),cc.Database.Connection.ConnectionString为空。调用.ToString()会导致NullReferenceException。这就是你没有看到消息框的原因。正如其他人所说 - 使用MessageBox进行这种调试并不是一个好主意。在catch中你应该打印不是消息,但是e.ToString()它将显示应该指向问题所在的堆栈跟踪。