2012-05-22 61 views
0

我已经在MVC web应用程序中创建了自定义MembershipProvider。我的GetUser函数返回我自己定制的Employee类的一个实例,它继承自标准的MembershipUser。这使我可以为每个用户提供更多详细信息,例如各种员工详细信息。ASP.NET自定义MembershipProvider和共享DbContexts

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并指定以前检索到该记录的用户,然后将其保存到数据库,其自己模型库。你可能会看到这是怎么回事,框架抱怨说我试图用最初没有检索到的上下文来保存对象(用户)。

我目前的,相当冒险的解决方案是只使用从Membership.GetUser检索到的用户的ID,并从我当前的模型存储库中重新获取Employee对象。

newSickness.Employee = this.modelRepository.GetModelById<Employee>(this.me.Id.Value); 

我试着拆卸Employee对象,但随后就失去了延迟加载的特性,我要记住,试图重新插入到我目前的资料库/上下文。

我也读过它是很好,让您的自定义成员资格提供程序共享当前请求将使用相同的上下文。任何想法如何实现这一点,我如何确保成员资格提供者使用与用户执行控制器操作时产生的相同的上下文?

回答

0

您可以为每个控制器有一个单独的DbContext实例。

public class SomeController : Controller 
{ 
    private DbContext context = new DbContext(); 
    private CustomMembershipProvider membershipProvider = new CutomMembershipProvider(this.context); 

    ... Actions .... 
} 

据我所知,每个控制器一个上下文是很好的做法。

顺便说一句,如果您有多个存储库,请尝试使用UnitOfWork with Repository模式。

相关问题