如果用户不是当前用户,EF 将不会返回用户

本文关键字:用户 返回 EF 如果 | 更新日期: 2023-09-27 17:57:09

我在实体框架中遇到了一个奇怪的问题,如果我尝试访问不是当前用户的用户变量,它会抛出错误。我正在使用 ASP.NET MVC 4 与 SignalR(这位于 SignalR 中心)和 SimpleMembership 来提供身份验证。

这是我的代码:

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);
        }
    }
}

如果post.Poster与当前登录用户相同,它将返回发布帖子的正确用户,但如果不是,则post.Poster将为 null,post.Poster.ID将引发异常。如果我取出所有 currUser 代码(并且只执行 if(true)),错误仍然会发生,因此它似乎与 currUser 变量无关。我什至没有对网络安全做任何事情 - 从页面顶部删除using System.Web.Security;并不能修复它。我不知道它似乎如何知道当前用户是谁,而且如果它是当前用户,它只会返回海报,这似乎很奇怪。

以下是我的代码优先模型的重要部分:

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();
    }
}

在我的数据库中,Poster_ID列都设置正确,因此这似乎不是问题。

感谢您的帮助!

如果用户不是当前用户,EF 将不会返回用户

需要告诉 EF 预先加载 User 属性,在查询中访问它,或者将其设置为虚拟,以便代理可以延迟加载它们 - 类似于设置集合的方式。 它适用于当前用户,因为对象已加载。

例如:

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);
}