Ada*_*msy 5 asp.net-mvc entity-framework asp.net-mvc-4
我正在尝试创建一个自定义模型(例如博客文章),该模型与实体"UserProfile"相关,该实体由MVC 4模板中使用的WebSecurity功能用于注册和oAuth身份验证.
示例如下:
public class Post
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Detail { get; set; }
public UserProfile User { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我能够正确地将当前的UserProfile关联到博客帖子,如下所示:
post.User = user = db.UserProfiles.FirstOrDefault(u => u.UserName.ToLower() == WebSecurity.CurrentUserName);
db.Posts.Add(post);
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
但是当我尝试从数据库中获取Blog帖子时,我得到了一个用户的空对象:
var post = db.Posts.Where(x => x.Id == postId).FirstOrDefault();
post.User is null!
Run Code Online (Sandbox Code Playgroud)
我相信这是因为创建SimpleMembershipProvider时在数据库中创建的关系:
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "Id", "UserName", autoCreateTables: true);
Run Code Online (Sandbox Code Playgroud)
我确定必须有一种方法可以忽略这些或者在我的博客类的User属性中添加一个属性来克服这个问题?
提前致谢.
由于您没有使用急切加载(例如通过使用 .include),因此您必须将 User 属性设置为virtual,因此它可以由 EF 延迟加载(默认为 DataContext 启用延迟加载 - 所以如果您没有更改此属性) ,延迟加载应该有效)。
public class Post
{
...
public virtual UserProfile User { get; set; } // navigation properties need to be virtual to support lazy loading
...
}
Run Code Online (Sandbox Code Playgroud)
如果您不想延迟加载,则需要包含Navigation (并执行预先加载)属性,例如:
var postWithUser = db.Posts
.Include(p => p.User)
.Where(x => x.Id == postId)
.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
您可能会发现这篇关于延迟/渴望加载的文章很有趣(或者只是谷歌搜索 EF 和延迟/渴望加载)
归档时间: |
|
查看次数: |
1219 次 |
最近记录: |