2

私は MVC の世界では比較的新しく、既定の Microsoft メンバーシップ プロバイダーを使用する MVC3、C# .Net、EF4 アプリケーションを開発しています。メンバーシップ プロバイダー テーブルにいくつかの追加フィールドを追加する必要があります。これは、各ユーザーの拡張プロファイルを作成するのに役立ちます。(このデータを保持するテーブルは Profile と呼ばれ、ProfileId INT の PK を持ち、aspnet_Users/aspnet_Membership からの UserId の FK も保持します。)

新規ユーザーに、登録後すぐにプロファイルを入力する機会を提供したいので、プロファイル テーブルに必要な値をすぐに入力できるページにリダイレクトします。登録はうまくいきます。データベース内のプロファイル レコードと同様に、ユーザーが作成されます。

問題が発生するのは、ユーザーをそのプロファイル編集ページに誘導し、データを取得しようとしたときです。System.Web.Security.Membership.GetUser().ProviderUserKey にアクセスして UserId を取得し、それに基づいて Profile レコードを見つけます。

これは機能し、理解できたと思いましたが、どこかで間違いを犯したに違いなく、正しく機能させることができません。エラー メッセージはかなり一般的で、UserId の GUID 値を使用して ProfileId INT 値を見つけることができないことを示しているようです。

    // GET: /Profile/Entry/

    public ActionResult Entry()
    {
        Guid currentUser = (Guid)System.Web.Security.Membership.GetUser().ProviderUserKey;
        Profile profile = db.Profiles.Find(currentUser);
        ViewBag.UserId = new SelectList(db.aspnet_Users, "UserId", "UserName", profile.UserId);
        return View(profile);
    }

エラーメッセージ:

Server Error in '/' Application.
--------------------------------------------------------------------------------

The argument types 'Edm.Int32' and 'Edm.Guid' are incompatible for this operation. Near     WHERE predicate, line 1, column 76. 
Description: An unhandled exception occurred during the execution of the current web     request. Please review the stack trace for more information about the error and where it     originated in the code. 

Exception Details: System.Data.EntitySqlException: The argument types 'Edm.Int32' and     'Edm.Guid' are incompatible for this operation. Near WHERE predicate, line 1, column 76.

Source Error: 
Line 127:        {
Line 128:            Guid currentUser = (    Guid)System.Web.Security.Membership.GetUser().ProviderUserKey;
Line 129:            Profile profile = db.Profiles.Find(currentUser);
Line 130:            ViewBag.UserId = new SelectList(db.aspnet_Users, "UserId",     "UserName", profile.UserId);
Line 131:            return View(profile);

デフォルト/想定された Id 列が ProfileId INT であっても、その db.Profiles.Find(currentUser) を具体的にターゲットにして UserId GUID 値を見つける方法についてのアイデアはありますか?

4

1 に答える 1

3

Find は主キーに基づいてテーブルを検索します。これは、あなたの場合は int であり、Membership Provider Key (GUID) とは関係ありません。したがって、検索は使用できません。

代わりに、次のような Linq クエリを使用します。

Profile profile = db.Profiles.Where(x => x.AspMembershipUserID == currentUser).FirstOrDefault();
于 2012-05-15T03:32:33.893 に答える