我正在尝试创建一个由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。
我在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调用都是一个单独的请求,它会创建一个单独的范围?
所以每个电话基本上都是:
请求
验证过滤器
控制器
异步功能
异步获取当前用户 - &gt;返回用户(不破坏上下文)
异步存储库功能
从存储库返回
从控制器返回
谷歌没有帮助,所以我认为我做错了什么:)
答案 0 :(得分:1)
原来是这一行:
opt.UseSqlServer(new SqlConnection(Configuration["CONNECTIONSTRINGS_AZURECONNECTION"]), builder => builder.MigrationsAssembly("Application.Web"));
一旦我改变它,一切都按预期工作
opt.UseSqlServer(Configuration["CONNECTIONSTRINGS_AZURECONNECTION"], builder => builder.MigrationsAssembly("Application.Web"));