我创建了一个新的MVC4互联网应用程序。开箱即用,它在帐户模型中附带此类:
[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
}
它似乎是一个添加我所有其他用户信息并将我的表链接到的好地方。它被称为“配置文件”的事实对我来说似乎有点奇怪,因为这似乎是“基础”用户类。
我在数据库中看到一个名为webpages_Membership
的表,但我不知道该模型的位置。使用OpenID创建帐户时,它看起来就像是一个记录甚至插入那里。我认为这仅适用于本地帐户,因此“UserProfile”似乎是用户唯一保证拥有的东西。
无论如何,基类Controller
类似乎将Profile
属性定义为ProfileBase
但是当我使用调试器进行检查时,它是System.Web.Profile.DefaultProfile
,并且它没有好像被“填补”了。即使我已登录,IsAnonymous
为真,UserName
为null
。
我猜这是故意的?我是否希望通过定义自己的基本控制器来覆盖它?
我看到this question和this article谈论扩展ProfileBase
,但这种做法对我来说似乎有些混乱。
考虑到上述所有注意事项,我最好只将所有额外属性添加到已为我创建的UserProfile
类中,然后添加一个扩展{BaseController
的新类Controller
1}},并覆盖/新建Profile
属性以返回UserProfile
。 (1)这是一个好方法吗?
我花了一段时间,但我最终想出了如何获取当前登录用户的UserProfile
对象:
udb.UserProfiles.Single(p => p.UserName == User.Identity.Name);
(2)这是获得它的最佳方法吗? UserProfile
有一个UserId
属性,但我无法弄清楚如何检索它。 (3)如何获取当前登录用户的UserId?
我以为我可以让属性延迟加载配置文件,因此它只在您第一次访问该属性时才会访问数据库。我读了一些其他文章,谈论json序列化整个用户类,所以它不必每次加载页面都会遇到DB,但这听起来更加混乱,并且你冒着数据不同步的风险。
试过这个:
public class BaseController : Controller
{
private UsersContext _udb = new UsersContext();
private UserProfile _profile = null;
public new UserProfile Profile
{
get
{
if(_profile == null && User.Identity.IsAuthenticated)
{
_profile = _udb.UserProfiles.Single(p => p.UserName == User.Identity.Name);
}
return _profile;
}
}
}
似乎完美无缺地工作。