System.ObjectDisposeException:'无法在 NEt6 中使用 EntityFramework 访问已处置的上下文实例

问题描述 投票:0回答:1

我尝试实现 UnitOfWork 赞助人,当执行我的应用程序时,访问数据库后,收到错误:System.ObjectDisposeException:'无法访问已处置的上下文实例

这是我在模型中的 OnPost 方法:

Register.cshtml

        public async void OnPost(string name, string email, string emailConfirm, string password, string passworConfirm) 
        {
            try
            {
                var user = mapUser(name, email, password);
                await _securityService.RegisterNewUserAsync(user);
            }
            catch
            (Exception ex)
            {

            }
        
        }

这是我的 RegisterNewUser 方法失败的部分(_userService.GetByNameOrEmailAsync)

namespace CompanyMannager.Services.Security
{
    public class SecurityService : ISecurityService
    {
        private readonly IUserService _userService;

        public SecurityService(IUserService userService)
        {
            _userService = userService;
        }

        public async Task RegisterNewUserAsync(User user)
        {

           
           // var userTokenService  = new UserTokenService(_unitOfWork);

            var users  = await _userService.GetByNameOrEmailAsync(user.Name, user.Email);

           if (users.Any())
            {
                throw new DuplicateNameException("The name or email is already in use, please try when other email and name.");
            }

            await _userService.CreateUser(user, Convert.ToBase64String(salt));

        }
    }
}

这是用户服务:

namespace CompanyMannager.Services
{
    public class UserService : IUserService
    {
        private readonly IUnitOfWork _unitOfWork;
        public UserService(IUnitOfWork unitOfWork)
        {
            _unitOfWork = unitOfWork;
        }
       

        public async Task<IEnumerable<User>> GetByNameOrEmailAsync(string name, string email)
        {
            return await _unitOfWork._userRepository.GetAsync(x => x.Name == name || x.Email == email);
        }
    }
}

这是用户存储库:

public class UserRepository : BaseRepository<User>, IUserRepository
    {
        public UserRepository(CompanyMannagerDBContext context) : base(context) 
        {
        }

    }

它是基础存储库:

 public class BaseRepository<TEntity> : IBaseRepository<TEntity> where TEntity : class
    {
        private readonly CompanyMannagerDBContext _Context;
        internal DbSet<TEntity> dbSet;

        public BaseRepository(CompanyMannagerDBContext context)
        {
            _Context = context;
            dbSet = context.Set<TEntity>();
        }

    public async Task<IEnumerable<TEntity>> GetAsync(Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, string includeProperties = "")
        {
            IQueryable<TEntity> query = dbSet;

            if (filter != null)
                query = query.Where(filter);

            foreach (var includeProperty in includeProperties.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
            {
                query = query.Include(includeProperty);
            }

            if (orderBy != null)
                return await orderBy(query).ToListAsync();
            else
                return await query.ToListAsync();
        }
    }
}

这是工作单元:

public class UnitOfWork : IUnitOfWork
    {
       
        public IUserRepository _userRepository { get; }
        public IUserTokenRepository _userTokenRepository { get; }

        private readonly CompanyMannagerDBContext _context;

        public UnitOfWork(CompanyMannagerDBContext context, IUserRepository userRepository, IUserTokenRepository userTokenRepository)
        {
            _context = context;
            _userRepository = userRepository;
            _userTokenRepository = userTokenRepository;

            /*  public IUserRepository UserRepository => _userRepository ??= new UserRepository(_context);

              public IUserTokenRepository UserTokenRepository => _userTokenRepository ??= new UserTokenRepository(_context); */

        }

        public async Task<int> CommitAsync()
        {
            return await _context.SaveChangesAsync();
        }

        public void Dispose()
        {
            _context.Dispose();
        }
    }
}

我的错误是什么?

谢谢

我尝试修改依赖注入,因为我是新手,但错误仍然存在

.net-6.0 unit-of-work
1个回答
0
投票

我更改了代码以使用基本 EF,如果错误仍然存在:

System.ObjectDisposeException:“无法访问已处置的上下文实例。导致此错误的一个常见原因是处置从依赖项注入解析的上下文实例,然后尝试在应用程序的其他位置使用相同的上下文实例。如果您在上下文实例上调用“Dispose”或将其包装在 using 语句中,则可能会发生这种情况。如果您使用依赖项注入,则应该让依赖项注入容器负责处理上下文实例。 ObjectDispose_ObjectName_Name'

CompanyMannager.Services.UserService.GetByNameOrEmailAsync(string, string) en UserService.csCompanyMannager.Services.Security.SecurityService.RegisterNewUserAsync(CompanyMannager.Core.Entities.User) en SecurityService.cs CompanyMannager.UI.Areas.Identity.Pages.RegisterModel.OnPost(string, string, string, string, string) en Register.cshtml.cs

注册.cshtml:

 public async void OnPost(string name, string email, string emailConfirm, string password, string passworConfirm) 
    {
        try
        {
            var user = mapUser(name, email, password);
            await _securityService.RegisterNewUserAsync(user);
        }
        catch
        (Exception ex)
        {

        }
    
    }

SecurityService.cs:

{
public class SecurityService : ISecurityService
{
    private readonly IUserService _userService;

    public SecurityService(IUserService userService)
    {
        _userService = userService;
    }

    
    public async Task RegisterNewUserAsync(User user)
    {
      
        var users  = await _userService.GetByNameOrEmailAsync(user.Name, user.Email);

        if (users.Any())
        {
            throw new DuplicateNameException("The name or email is already in use, please try when other email and name.");
        }
    }
}

}

UserService.cs:

{
public class UserService : IUserService
{
    private readonly CompanyMannagerDBContext _companyMannagerDBContext;

    public UserService(CompanyMannagerDBContext context)
    {
        _companyMannagerDBContext = context;
    }

  
    public async Task<IEnumerable<User>> GetByNameOrEmailAsync(string name, string email)
    {
        return await _companyMannagerDBContext.Users.Where(x => x.Name == name || x.Email == email).ToListAsync();
    }
}

}

用户.cs

public partial class User
{
    public int UserId { get; set; }
    public string? Name { get; set; }
    public string? NormalizedName { get; set; }
    public string? PasswordHash { get; set; }
    public string? CreateUser { get; set; }
    public DateTime? CreateDate { get; set; }
    public string? LastUpdatedUser { get; set; }
    public DateTime? LasteUpdatedDate { get; set; }
    public string? Email { get; set; }
    public string? NormalizeEmail { get; set; }
    public string? EmailVerified { get; set; }
    public DateTime? ExpirationDate { get; set; }

    public User() { }
}

我没有找到错误,请帮助我!

© www.soinside.com 2019 - 2024. All rights reserved.