【问题标题】:Database connection error from Azure siteAzure 站点的数据库连接错误
【发布时间】:2016-07-20 19:19:17
【问题描述】:

我已经开始创建一个新的 aspnet core 1 应用程序并完成了足够的工作以部署到 azure。我能够将我的本地数据库复制到一个 azure sql 数据库并部署我的应用程序。当我在本地(VS2015)针对 azure sql 数据库运行我的应用程序时,该应用程序运行良好。当我从 azure 对 azure sql db 运行应用程序时,登录应用程序后出现以下错误。

处理请求时数据库操作失败。

InvalidOperationException: 已经有一个打开的 DataReader 与必须先关闭的此命令相关联。有 ApplicationDbContext 的待定模型更改在 Visual Studio 中,使用 包管理器控制台为这些 更改并将它们应用到数据库:

PM> Add-Migration [迁移名称] PM> Update-Database 或者, 您可以搭建一个新的迁移并从命令提示符处应用它 你的项目目录:

dotnet ef 迁移添加 [迁移名称] dotnet ef 数据库更新

为我的每个上下文运行更新数据库成功完成,但没有解决问题。

我很乐意分享所需的任何其他信息。

编辑 #1:添加代码示例

public class CompaniesController : Controller
{
    private readonly SEESContext _context;
    private readonly IEmailSender _emailSender;
    private readonly UserManager<ApplicationUser> _userManager;

    public CompaniesController(
        SEESContext context,
        IEmailSender emailSender,
        UserManager<ApplicationUser> userManager)
    {
        _context = context;
        _emailSender = emailSender;
        _userManager = userManager;
    }
// GET: Companies/MyCompany/
    [Authorize(Roles = RoleNames.CompanyAdministrator)]
    public async Task<IActionResult> MyCompany(string sortOrder, string searchEmployee)
    {
        var company = await _context.Companies.SingleOrDefaultAsync(m => m.CompanyID == Convert.ToInt32(User.Identity.GetCompanyId()));

        var model = new MyCompaniesModel(company);

        model = await PopulateEmployeeData(sortOrder, searchEmployee, company, model);

        model = PopulateJobData(company, model);

        return View(model);
    }
private async Task<MyCompaniesModel> PopulateEmployeeData(string sortOrder, string searchEmployee, Company company, MyCompaniesModel model)
    {
        ViewBag.NameSortParm = string.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
        ViewBag.RoleSortParm = sortOrder == "role_asc" ? "role_desc" : "role_asc";

        var employeeViewModels = new List<EmployeeViewModel>();

        var users = _userManager.Users.Where(x => x.CompanyID == company.CompanyID);

        foreach (var user in users)
        {
            var roles = await _userManager.GetRolesAsync(user);

            employeeViewModels.Add(new EmployeeViewModel { Id = user.Id, Name = user.FullName, Role = roles[0] });
        }

        if (!string.IsNullOrEmpty(searchEmployee))
        {
            employeeViewModels = employeeViewModels.Where(s => s.Name.Contains(searchEmployee)).ToList();
        }

        switch (sortOrder)
        {
            case "name_desc":
                employeeViewModels = employeeViewModels.OrderByDescending(x => x.Name).ToList();
                break;
            case "role_desc":
                employeeViewModels = employeeViewModels.OrderByDescending(x => x.Role).ToList();
                break;
            case "role_asc":
                employeeViewModels = employeeViewModels.OrderBy(x => x.Role).ToList();
                break;
            default:
                employeeViewModels = employeeViewModels.OrderBy(s => s.Name).ToList();
                break;
        }

        model.Employees = employeeViewModels.ToList();

        return model;
    }

    private MyCompaniesModel PopulateJobData(Company company, MyCompaniesModel model)
    {
        var jobs = _context.Jobs.Where(x => x.CompanyId == company.CompanyID && x.IsActive).OrderBy(x => x.Name).ToList();

        var jobViewModels = jobs.Select(job => new JobViewModel { Id = job.JobId, Name = job.Name }).ToList();

        model.Jobs = jobViewModels.ToList();

        return model;
    }

【问题讨论】:

  • 您使用什么库来访问数据库?您使用的是实体框架或类似的 ORM,还是普通的 SqlConnection?多个活动结果集肯定会有所帮助,但这种失败通常意味着您的 SqlConnection 有问题。
  • 应用程序正在使用 EF Code First

标签: azure ef-code-first asp.net-core azure-sql-database


【解决方案1】:
  • 按照here 的建议尝试 enabling 多个活动结果集 (MARS)。
  • 尝试为所有数据库查询注入相同的 DbContext 实例
  • 如果出现延迟加载问题,请尝试使用Include

【讨论】:

  • 火星已开启!
  • 然后,我会尝试通过使用块在函数调用中处理额外的 DbContext 实例。在所有存储库中注入相同的 DbContext 实例并保存在一个地方,这也对我的场景有所帮助。
  • 由于我使用的是 asp.net 核心,因此注入发生在我的控制器中。我将编辑问题以显示登录后调用的代码,该代码不适用于 azure 但在本地。
  • 我已将 MARS 添加到 appsettings.json 文件中的连接字符串中,但只是注意到 Azure 网站上的连接字符串没有更新。我手动更新了它,它现在可以工作了!
猜你喜欢
  • 2014-06-08
  • 2013-06-02
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多