Asp.net mvc 无法在实体框架模型中使用MVC 4模板中的UserProfile?

Asp.net mvc 无法在实体框架模型中使用MVC 4模板中的UserProfile?,asp.net-mvc,entity-framework,asp.net-mvc-4,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,我试图创建一个与实体“UserProfile”相关的自定义模型(例如博客文章),该实体由MVC4模板中用于注册和oAuth身份验证的WebSecurity功能使用 示例如下: public class Post { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int Id { get; set; } public string Detail { get; s

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

示例如下:

public class Post
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Detail { get; set; }
    public UserProfile User { get; set; }
}
我能够正确地将当前用户配置文件与博客文章关联,如下所示:

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);
我确信一定有办法忽略这些,或者在我的blog类的User属性中添加一个属性来克服这个问题


提前感谢。

由于您没有使用即时加载(例如,通过使用.include),您必须将用户属性设置为虚拟的,以便EF可以对其进行延迟加载(默认情况下,为DataContext启用延迟加载-因此,如果您没有更改此设置,延迟加载应该可以工作)

如果不希望延迟加载,则需要包含导航属性(并执行快速加载),例如:

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

你可能会发现很有趣(或者只是google for EF和lazy/Eanger loading)

我认为用户属性必须是虚拟的,以便EF可以延迟加载。公共虚拟用户配置文件用户{get;set;}刚刚测试了它,这就解决了我的问题!谢谢你的帮助。如果我回答我自己的问题,你能标记为提供答案吗?
var postWithUser = db.Posts
                           .Include(p => p.User)
                           .Where(x => x.Id == postId)
                           .FirstOrDefault();