asp.net-mvc - 无法在 Entity Framework 模型中的 MVC 4 模板中使用 UserProfile?

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

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

下面的例子:

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 属性中添加一个属性来克服这个问题?

提前致谢。

最佳答案

由于您没有使用预先加载(例如,通过使用 .include),您必须设置 User 属性 虚拟 ,因此它可以由 EF 延迟加载(默认为 DataContext 启用延迟加载 - 所以如果您没有更改它,延迟加载应该可以工作)。

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

如果你不想延迟加载,你需要包括 导航(并执行 急切加载 )属性,例如:
var postWithUser = db.Posts
                           .Include(p => p.User)
                           .Where(x => x.Id == postId)
                           .FirstOrDefault();

您可能会发现 this article on lazy / eager loading有趣(或者只是谷歌搜索 EF 和懒惰/急切加载)

关于asp.net-mvc - 无法在 Entity Framework 模型中的 MVC 4 模板中使用 UserProfile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13828638/

相关文章:

java - 如何使用 Pusher 使用 ClientID 从客户端向服务器发送消息

jquery - 点击按钮不触发jquery函数

c# - 是什么触发了早期 session 超时

html - 使用 Asp.net 单击 HTML 页面上的某些链接时如何打开 Windows 文件夹

asp.net-mvc-4 - 在 Html.BeginForm 内传递路由值,但在操作方法中获取零

asp.net-mvc - 我该如何处理 reCAPTCHA v3 中的低分?

c# - 排除/包含导航属性

c# - 在 C# 的 LINQ 中按多列分组

c# - 如何在 Entity Framework 中插入/更新主从?

asp.net - 如何将 ASP.Net MVC 4 应用程序放入源代码管理中?