Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果用户不是当前用户,EF不会返回用户?_C#_Asp.net_Entity Framework_Asp.net Mvc 4 - Fatal编程技术网

C# 如果用户不是当前用户,EF不会返回用户?

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

实体框架有一个奇怪的问题,如果我试图访问一个不是当前用户的用户变量,它会抛出一个错误。我正在使用ASP.NETMVC4和SignalR(这是在SignalrHub中)以及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);
        }
    }
}
在我的数据库中,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);
}