【问题标题】:EntityException occurred in EntityFramework.SqlServer.dllEntityFramework.SqlServer.dll 中发生 EntityException
【发布时间】:2016-06-08 05:20:15
【问题描述】:

我的控制器代码

   ParaEntities db = new ParaEntities();
    public List<Client> GetAllClients()
    {
        return db.Client.ToList();
    }

Please click this link to see the error message

奇怪的是,当我第一次单击按钮获取所有客户端信息时,它会响应 500。第二次单击按钮获取所有客户端,这是成功的。

【问题讨论】:

  • 这似乎是一个连接字符串问题。您是否使用此上下文检索过任何其他记录?
  • 是的,我多次使用这个上下文。正如我所说,它第一次不起作用。第一次后它成功运行。我认为这是EF问题中的一些问题,例如延迟加载或您所说的连接字符串问题

标签: asp.net sql-server asp.net-mvc entity-framework linq


【解决方案1】:

您应该分配变量并在视图中显示数据。 请按照我在下面的说明更改语法。

ParaEntities db = new ParaEntities();
public List<Client> GetAllClients()
{
    var getData= db.Client.ToList();
       if(getData==null)
           {
               return null;
            }
    return getData;
}

【讨论】:

  • 代码在WebAPI中使用,不需要返回View。我已经尝试过你的代码。发生了一些问题
  • 但问题是,如果从您的实体返回 Null 数据,则会导致错误。所以我写将数据存储在变量中。
  • 是的。我试过你的代码。这没用。正如我所说,它第一次不起作用。第一次后它成功运行。我认为这是 EF 问题中的一些问题。
【解决方案2】:

此错误指向连接问题,而不是代码问题。检查连接字符串是否有效以及连接字符串中指定的用户是否有权访问数据库。如果您在 IIS 上运行应用程序,请确保 applicationpool 用户有权访问数据库。 Here 是另一个 SO 问题,如果他们解决了这个错误。

如果您想将 db 上下文作为局部变量存储在控制器类中,那么我建议您在控制器构造函数中实例化它。然后确保每次创建控制器实例时都会创建一个新的数据库上下文。 假设您的控制器命名为 ClientController

private ParaEntities db;
public ClientController()
{
    this.db = new ParaEntities();
}

public List<Client> GetAllClients()
{
   return db.Client.ToList();
}

另一种方法是将数据库上下文包装在方法内部的 using 语句中。在这种情况下,您要确保该方法在被调用时使用了新的上下文,并且在操作完成时正在释放上下文。

public List<Client> GetAllClients()
{
    using(ParaEntities db = new ParaEntities())
    {
       return db.Client.ToList();
    }
}

PS:这两个例子都违反了依赖倒置原则(硬耦合到数据库上下文),但那是另一天

【讨论】:

  • 嗨,Marcus,这个案例是针对 WebAPI 的,所以在这种情况下我不能处理数据库上下文。但是,我已经尝试了您的代码。它引起了另一个问题。顺便说一句:正如我所说,它第一次不起作用。第一次成功后。
  • @GaoxinHuang 通过你展示的例子,你可以处理它。当您将它存储在方法中时,您收到了什么错误消息?无论哪种方式,我都用一个关于如何在控制器中创建本地数据库上下文的新示例更新了答案。
  • 我将当前数据库更改为新的数据库服务器。它成功地工作。是否可能是数据库服务器的稳定性问题?
  • 好的。初始错误消息表明与数据库的连接存在问题。正如您所指出的,它可能是数据库服务器,但由于它在第二次调用时对您有用,所以很难说。您是否尝试过在控制器构造函数中实例化 db 上下文?
  • 太奇怪了,我尝试通过 SSMS 连接数据库。同样的问题发生了,当我第一次连接它并且它失败了。然后,我尝试了更多时间来连接数据库。它是成功的。
【解决方案3】:

请试试这个

public List<Client> GetAllClients() { ParaEntities db = new ParaEntities(); return db.Client.ToList(); }

【讨论】:

  • 是的,这可能是实体框架中的一个问题。我认为只有在第一个按钮单击那些 dbcontext 或发生初始化之类的事情之后,这就是为什么在第二次单击时加载来自 db 的值。请在dbcontext初始化时检查它以及在哪里
  • 请输入“var data = db.Client.ToList();”返回前检查第一次点击时“数据”是否为空
  • 我将当前数据库更改为新的数据库服务器。它成功地工作。是否可能是数据库服务器的稳定性问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多