我对MVC世界相对较新,正在开发使用默认Microsoft成员资格提供程序的MVC3,C#.Net,EF4应用程序。需要在成员资格提供程序表中附加一些附加字段,这有助于为每个用户构成扩展配置文件。 (保存此数据的表称为Profile,它具有ProfileId INT的PK,并且还保存来自aspnet_Users / aspnet_Membership的UserId的FK。)
我希望为新用户提供在注册后立即填写个人资料的机会,因此我将他们重定向到一个页面,他们可以立即输入我们想要的Profile表格。注册工作正常。创建用户,数据库中的配置文件记录也是如此。
当出现问题的时候,当我让用户进入该个人资料编辑页面时,我会尝试提取他们的数据。我要进入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);
有关db.Profiles.Find(currentUser)如何专门定位以查找UserId GUID值的任何想法,即使默认/假设Id列是ProfileId INT?
答案 0 :(得分:3)
查找基于其主键的表,在您的情况下是一个int,并且与成员资格提供程序密钥(这是一个guid)无关。所以你不能使用Find。
而是使用Linq查询,例如:
Profile profile = db.Profiles.Where(x => x.AspMembershipUserID == currentUser).FirstOrDefault();