C# 如果用户不是当前用户,EF不会返回用户?
实体框架有一个奇怪的问题,如果我试图访问一个不是当前用户的用户变量,它会抛出一个错误。我正在使用ASP.NETMVC4和SignalR(这是在SignalrHub中)以及SimpleMembership来提供身份验证 以下是我的代码:C# 如果用户不是当前用户,EF不会返回用户?,c#,asp.net,entity-framework,asp.net-mvc-4,C#,Asp.net,Entity Framework,Asp.net Mvc 4,实体框架有一个奇怪的问题,如果我试图访问一个不是当前用户的用户变量,它会抛出一个错误。我正在使用ASP.NETMVC4和SignalR(这是在SignalrHub中)以及SimpleMembership来提供身份验证 以下是我的代码: using (CfDb db = new CfDb()) { var currUser = db.Users.FirstOrDefault(a => a.ID == UserID); if (currUser != null &&am
using (CfDb db = new CfDb())
{
var currUser = db.Users.FirstOrDefault(a => a.ID == UserID);
if (currUser != null && currUser.Challenge == Challenge)
{
var posts = db.Posts.Where(a => a.Privacy == "public").OrderByDescending(a => a.PostedTime);
List<int> People = new List<int>();
foreach (Post post in posts)
{
People.Add(post.Poster.ID);
}
}
}
在我的数据库中,Poster_ID列都设置正确,所以这似乎不是问题
谢谢你的帮助 您需要告诉EF立即加载您的用户属性,在查询中访问它,或者将其设置为虚拟,以便代理可以延迟加载它们-类似于设置集合的方式。它与当前用户一起工作,因为对象已加载 例如:
请记住,这将使它延迟加载。如果您正在处理100篇文章,那么在您尝试访问post.user.Id时,它将对每个用户的db执行一个新的查询。如果您将其保留为虚拟,并使用类似于我发布的查询,您将急切地加载相关用户。ORMs中的这种常见问题称为N+1问题。
public class User
{
[Key]
public int ID { get; set; }
[Required]
public string Username { get; set; }
[Required]
public string Email { get; set; }
[Required]
public string Realname { get; set; }
[Required]
public DateTime JoinDate { get; set; }
public virtual ICollection<User> Friends { get; set; }
[Required]
public string Challenge { get; set; }
public School School { get; set; }
public int Grade { get; set; }
[Required]
public double Vici { get; set; }
public virtual ICollection<Classroom> Classes { get; set; }
}
public class Post
{
public int ID { get; set; }
[Required]
public double Vici { get; set; }
public User Poster { get; set; }
public Classroom Class { get; set; }
[Required]
public string Content { get; set; }
public virtual ICollection<User> Likes { get; set; }
public virtual ICollection<Comment> Comments { get; set; }
public string Type { get; set; }
public string Privacy { get; set; }
[Required]
public DateTime PostedTime { get; set; }
}
public class CfDb : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>().HasMany(e => e.Likes).WithMany();
modelBuilder.Entity<User>().HasMany(e => e.Friends).WithMany();
modelBuilder.Entity<Post>().HasMany(e => e.Comments).WithMany();
modelBuilder.Entity<Comment>().HasMany(e => e.Likes).WithMany();
}
}
var posts = db.Posts.Where(a => a.Privacy == "public")
.OrderByDescending(a => a.PostedTime)
.Select(a=> new { Post = a, User = a.Poster });
foreach (var post in posts) {
People.Add(post.User.Id);
}