什么是让自己轻松访问MVC4中控制器中的UserProfile对象的最佳方法?

时间:2012-09-02 22:28:11

标签: entity-framework asp.net-mvc-4 visual-studio-2012

考虑

我创建了一个新的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为真,UserNamenull

我猜这是故意的?我是否希望通过定义自己的基本控制器来覆盖它?

我看到this questionthis 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;
        }
    }
}

似乎完美无缺地工作。

0 个答案:

没有答案