我在MVC Web应用程序中创建了一个自定义MembershipProvider。我的GetUser函数返回我自己的自定义Employee类的实例,该类继承自标准的MembershipUser。这允许我为每个用户提供其他详细信息,例如各种员工详细信息。
public override MembershipUser GetUser(string username, bool userIsOnline)
{
return new ModelRepository().GetModels<Employee>().Where(e => e.UserName == username).FirstOrDefault();
}
我遇到的问题是,成员资格提供程序会生成我的存储库类的新实例(它创建一个新的DbContext)来检索Employee对象。然后将此Employee对象传递给名为Membership api的任何请求/控制器操作。
Employee currentUser = (Employee)Membership.GetUser();
调用请求通常需要在内存中创建一个新对象,比如说新的SicknessRecord并将之前检索到的用户分配给该记录,然后将其保存到具有自己的模型库的数据库中。您可能会看到这种情况发生了,框架抱怨我正在尝试使用最初未检索到的上下文来保存对象(用户)。
我当前的,相当hackish的解决方案是只使用从Membership.GetUser检索的用户的ID,然后从我当前的模型库中重新检索Employee对象。
newSickness.Employee = this.modelRepository.GetModelById<Employee>(this.me.Id.Value);
我尝试分离Employee对象但是它失去了延迟加载的属性,我必须记得尝试将它再次附加到我当前的存储库/上下文。
我还读过,让您的自定义成员资格提供程序共享当前请求将使用的相同上下文是一件好事。任何想法如何实现这一点,我如何确保成员资格提供程序使用与用户执行控制器操作时产生的上下文相同的上下文?
答案 0 :(得分:0)
每个控制器可以有一个单独的DbContext实例。
public class SomeController : Controller
{
private DbContext context = new DbContext();
private CustomMembershipProvider membershipProvider = new CutomMembershipProvider(this.context);
... Actions ....
}
据我所知,每个控制器的一个上下文是很好的做法。
顺便说一句,如果您有多个存储库,请尝试将UnitOfWork与存储库模式一起使用。