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 回答