1

現在のユーザーではないユーザー変数にアクセスしようとすると、エラーがスローされるという、Entity Framework に関する奇妙な問題があります。認証を提供するために、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.Posternull になりpost.Poster.ID、例外がスローされます。すべての currUser コードを取り出して (そして if(true) を実行するだけで)、引き続きエラーが発生するため、currUser 変数に関連していないようです。私はWebSecurityで何もしていません-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 列はすべて正しく設定されているため、問題はないようです。

助けてくれてありがとう!

4

1 に答える 1

0

コレクションを設定する方法と同様に、プロキシがそれらを遅延ロードできるように、EF にユーザー プロパティを積極的にロードするか、クエリでアクセスするか、仮想化するように指示する必要があります。オブジェクトはすでにロードされているため、現在のユーザーで機能します。

例えば:

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);
}
于 2013-02-01T01:46:47.917 に答える