【问题标题】:Unable to use UserProfile in MVC 4 template within an Entity Framework Model?无法在实体框架模型中的 MVC 4 模板中使用 UserProfile?
【发布时间】:2013-02-08 06:46:41
【问题描述】:

我正在尝试创建与实体“UserProfile”相关的自定义模型(例如博客文章),该实体由 MVC 4 模板中用于注册和 oAuth 身份验证的 WebSecurity 功能使用。

下面的例子:

public class Post
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Detail { get; set; }
    public UserProfile User { get; set; }
}

我能够正确地将当前的 UserProfile 关联到博客文章,如下所示:

post.User = user = db.UserProfiles.FirstOrDefault(u => u.UserName.ToLower() == WebSecurity.CurrentUserName);
db.Posts.Add(post);
db.SaveChanges();

但是当我尝试从数据库中获取博客文章时,我为用户获取了一个空对象:

var post = db.Posts.Where(x => x.Id == postId).FirstOrDefault();
post.User is null!

我相信这是因为创建 SimpleMembershipProvider 时在数据库中创建的关系:

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "Id", "UserName", autoCreateTables: true);

我确定必须有一种方法可以忽略这些问题,或者在我的博客类的 User 属性中添加一个属性来解决这个问题?

提前致谢。

【问题讨论】:

  • 我认为 User 属性必须是虚拟的才能被 EF 延迟加载。 public virtual UserProfile User { get;放; }
  • 刚刚测试过,解决了我的问题!谢谢您的帮助。如果我回答我自己的问题,可以将您标记为提供答案吗?

标签: asp.net-mvc entity-framework asp.net-mvc-4


【解决方案1】:

由于您没有使用预先加载(例如,使用 .include),您必须将 User 属性设置为 虚拟,以便 EF 延迟加载(默认情况下,延迟加载已启用一个 DataContext - 所以如果你没有改变它,延迟加载应该可以工作)。

public class Post
{
    ...
    public virtual UserProfile User { get; set; } // navigation properties need to be virtual to support lazy loading
    ...
}

如果您不想延迟加载,则需要包含 Navigation(并执行eager loading)属性,例如:

var postWithUser = db.Posts
                           .Include(p => p.User)
                           .Where(x => x.Id == postId)
                           .FirstOrDefault();

您可能会发现 this article on lazy / eager loading 很有趣(或者只是 google 用于 EF 和延迟/急切加载)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2012-02-19
    相关资源
    最近更新 更多