0

我在 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 并将之前检索到的用户分配给该记录,然后将其保存到具有自己的模型存储库的数据库中。您可能会看到这是怎么回事,框架抱怨说我正在尝试使用最初未检索到的上下文来保存对象(用户)。

我当前的相当老套的解决方案是只使用从 Membership.GetUser 检索到的用户 ID,然后从我当前的模型存储库中重新检索 Employee 对象。

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

我尝试分离 Employee 对象,但它失去了延迟加载的属性,我必须记住尝试再次将其附加到我当前的存储库/上下文。

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

4

1 回答 1

0

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

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

    ... Actions ....
}

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

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

于 2013-01-11T11:00:07.313 回答