dotnet核心实体框架连接关闭

时间:2017-01-21 09:18:08

标签: c# entity-framework .net-core

我正在尝试创建一个由mssql和实体框架支持的API。

在我开始连接前端之前,一切似乎都很顺利。

我收到System.InvalidOperationException: The connection was not closed. The connection's current state is open.System.InvalidOperationException: Invalid operation. The connection is closed.的例外情况,具体取决于首先完成的API。

这是chromes观点 chrome

我在startup.cs中有以下内容

services.AddDbContext<ApplicationContext>(opt => {
    opt.UseSqlServer(new SqlConnection(Configuration["CONNECTIONSTRINGS_AZURECONNECTION"]), builder => builder.MigrationsAssembly("Application.Web"));
    opt.UseOpenIddict();
});

services.AddIdentity<User, Role>()
    .AddEntityFrameworkStores<ApplicationContext, Guid>()
    .AddDefaultTokenProviders();

我的所有存储库都是作用域

services.AddScoped<INotificationRepository, NotificationRepository>();

数据库上下文也是如此

services.AddScoped<ApplicationContext, ApplicationContext>();

两个控制器基本相同

private readonly INotificationRepository _notificationRepository;

public NotificationsController(UserManager<User> userManager, INotificationRepository notificationRepository)
    :base(userManager)
{
    _notificationRepository = notificationRepository;
}

[HttpGet]
public async Task<IActionResult> GetAsync()
{
    var user = await GetCurrentUserAsync();
    return new OkObjectResult(await _notificationRepository.FindByAsync(n => n.User == user));
}

我是否认为上下文需要根据请求确定范围? 每个chrome调用都是一个单独的请求,它会创建一个单独的范围?

所以每个电话基本上都是:

  1. 请求

  2. 验证过滤器

  3. 控制器

  4. 异步功能

  5. 异步获取当前用户 - &gt;返回用户(不破坏上下文)

  6. 异步存储库功能

  7. 从存储库返回

  8. 从控制器返回

  9. 谷歌没有帮助,所以我认为我做错了什么:)

1 个答案:

答案 0 :(得分:1)

原来是这一行:

opt.UseSqlServer(new SqlConnection(Configuration["CONNECTIONSTRINGS_AZURECONNECTION"]), builder => builder.MigrationsAssembly("Application.Web"));

一旦我改变它,一切都按预期工作

opt.UseSqlServer(Configuration["CONNECTIONSTRINGS_AZURECONNECTION"], builder => builder.MigrationsAssembly("Application.Web"));