Entity Framework dbContext 处理得太早
Entity Framework dbContext is disposed too early
我正在尝试让我的代码使用依赖注入,但我遇到了一些问题。
我有以下获取用户和关联角色的代码。
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
块的情况下使用它,因为在 using
块的末尾处理上下文。 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();
我正在尝试让我的代码使用依赖注入,但我遇到了一些问题。
我有以下获取用户和关联角色的代码。
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
块的情况下使用它,因为在 using
块的末尾处理上下文。 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();