Asp.net mvc 无法在实体框架模型中使用MVC 4模板中的UserProfile?
我试图创建一个与实体“UserProfile”相关的自定义模型(例如博客文章),该实体由MVC4模板中用于注册和oAuth身份验证的WebSecurity功能使用 示例如下: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
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();