0

MVC Web アプリケーションでカスタム MembershipProvider を作成しました。私の GetUser 関数は、標準の MembershipUser から継承する独自のカスタム Employee クラスのインスタンスを返します。これにより、さまざまな従業員の詳細など、各ユーザーの追加の詳細を提供できます。

    public override MembershipUser GetUser(string username, bool userIsOnline)
    {   
        return new ModelRepository().GetModels<Employee>().Where(e => e.UserName == username).FirstOrDefault();
    }        

私が抱えている問題は、メンバーシップ プロバイダーがリポジトリ クラスの新しいインスタンス (新しい DbContext を作成する) を生成して、Employee オブジェクトを取得することです。この Employee オブジェクトは、メンバーシップ API と呼ばれる要求/コントローラー アクションに渡されます。

Employee currentUser = (Employee)Membership.GetUser();

その呼び出し要求は、多くの場合、メモリ内に新しいオブジェクトを作成する必要があります。たとえば、新しい SicknessRecord を作成し、以前に取得したユーザーをそのレコードに割り当ててから、独自のモデル リポジトリを使用して DB に保存します。フレームワークは、最初に取得されなかったコンテキストでオブジェクト (ユーザー) を保存しようとしていると不平を言っています。

私の現在のかなりハックな解決策は、Membership.GetUser から取得したユーザーの ID を使用して、現在のモデル リポジトリから Employee オブジェクトを再取得することです。

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

Employee オブジェクトをデタッチしようとしましたが、遅延ロードされたプロパティが失われ、現在のリポジトリ/コンテキストに再度アタッチすることを忘れないでください。

また、現在のリクエストが使用するコンテキストと同じコンテキストをカスタム メンバーシップ プロバイダーで共有するのが良いことも読みました。これを達成する方法はありますか?ユーザーがコントローラーアクションを実行したときに生成されたものと同じコンテキストをメンバーシッププロバイダーが使用するようにするにはどうすればよいですか?

4

1 に答える 1

0

コントローラーごとに個別の DbContext インスタンスを 1 つ持つことができます。

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

    ... Actions ....
}

私の知る限り、コントローラーごとに 1 つのコンテキストを使用することをお勧めします。

ちなみに、複数のリポジトリがある場合は、 UnitOfWork with Repository パターンを使用してみてください。

于 2013-01-11T11:00:07.313 に答える