问题描述
我正在尝试访问SignalR集线器中的DbContext,但它始终抛出此异常:
{“值不能为空。(参数'unitOfWork')”}
我不知道这是什么问题。这是我的代码:
public class MyHub : Hub
{
private readonly IRepository<MyTable,long> _repository;
public MyHub (IRepository<MyTable,long> repository)
{
_repository = repository;
}
public async Task Get(TestDto testDto)
{
try
{
var myData = await _repository.GetDbContext().Set<MyTable>()
.Include(x => x.obj1)
.ThenInclude(x => x.list1)
.ThenInclude(x => x.obj2)
.ToListAsync();
await Clients.All.SendAsync("Get",myData);
}
catch (Exception ex)
{
throw new UserFriendlyException(ex.InnerException.Message.ToString());
}
}
}
注意:我正在使用ASP.NET Boilerplate框架(.NET Core 3.1和Angular)
解决方法
添加[UnitOfWork]
属性并将其设置为virtual
方法:
[UnitOfWork]
public virtual async Task Get(TestDto testDto)
{
// ...
}
或者您可以注入IUnitOfWorkManager
来显式地开始UnitOfWork
:
public async Task Get(TestDto testDto)
{
using (var uow = UnitOfWorkManager.Begin())
{
try
{
var myData = await _repository.GetDbContext().Set<MyTable>()
.Include(x => x.obj1)
.ThenInclude(x => x.list1)
.ThenInclude(x => x.obj2)
.ToListAsync();
await Clients.All.SendAsync("Get",myData);
}
catch (Exception ex)
{
throw new UserFriendlyException(ex.InnerException.Message.ToString());
}
}
}