繁体   English   中英

实体框架dbContext处理为时过早

[英]Entity Framework dbContext is disposed too early

我试图使我的代码与Dependency Injection一起工作,但出现了一些问题。

我有以下代码可提取用户和关联的角色。

public virtual User GetUser(string username,string password,evolutiondbEntities context, IUserRole userRoleRepository)
        {
            User systemUser = new User();
            using(context)
            {
                systemUser = (from u in context.Users where u.Username == username && u.UserPassword == password select u).FirstOrDefault();
                List<IUserRole> roleList = userRoleRepository.GetRoles(systemUser.UserID);
                systemUser._roles = roleList;
            }

            return systemUser;
        }

GetRoles方法的代码如下

public List<IUserRole> GetRoles(string userID,evolutiondbEntities context)
        {
            List<IUserRole> roleList = new List<IUserRole>();
            using(context)
            {
                roleList = (from r in context.UserRoles where r.UserID == userID select r).ToList<IUserRole>();
            }

            return roleList;
        }

该代码正确地提取了用户,但是当它调用GetRoles()方法时,上下文似乎已被释放,因此失败。

注意:我知道我应该为上下文传递一个接口,但是我还没走那么远。

您应该将上下文注入服务中,并在不using block的情况下使用它,因为在using上下文结束后using block时。 您的IoC容器负责按照您的说明实例化和处置创建的对象。

因此,您通常会有以下内容:

IoC注册:

container.For<Context>().Use<Context>();

为您服务:

public class SomeService : ISomeService
{
    private readonly Context _context;
    private readonly IUserRole _userRoleRepository;
    public SomeService(Context context, IUserRole userRoleRepository)
    {
        _context = context;
        _userRoleRepository = userRoleRepository;
    }

    public virtual User GetUser(string username, string password)
    {
        User systemUser = new User();         
        systemUser = (from u in _context.Users where u.Username == username && u.UserPassword == password select u).FirstOrDefault();
        List<IUserRole> roleList = _userRoleRepository.GetRoles(systemUser.UserID);
        systemUser._roles = roleList;          

        return systemUser;
    }
}

过去,我使用Ninject遇到过类似的问题。 如果您不使用Ninject,则您的IoC很可能具有类似的东西。

在上下文的Ninjects绑定下,我必须使用.InRequestScope()方法。

kernel.Bind<EmployeeDbContext>().ToSelf().InRequestScope();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM