0

我正在开发的网站采用标准社交网络范式:Friends 和 FriendRequests。

我的用户和好友请求类如下:

public class User
{
    public int Id { get; set; }

    public ICollection<FriendRequest> FriendRequests { get; set; }
}

public class FriendRequest
{
    public int UserId { get; set; }
    public int FriendId { get; set; }

    public DateTime RequestDate { get; set; }

    public User User { get; set; }
    public User Friend { get; set; }
}

我的流利映射是:

modelBuilder.Entity<User>()
    .HasMany(u => u.FriendRequests)
    .WithRequired(f => f.User)
    .HasForeignKey(f => f.UserId);

modelBuilder.Entity<FriendRequest>()
    .HasKey(f => new { f.UserId, f.FriendId });

modelBuilder.Entity<FriendRequest>()
    .HasRequired(f => f.Friend)
    .WithMany()
    .HasForeignKey(f => f.FriendId);

我正在与我的 2 个测试用户一起工作 - 用户 22 和用户 18

用户 22 在数据库中有来自用户 18 的好友请求

UserId  FriendId    DateRequested         RequestStatus  DateResponded
22      18          2012-05-28 16:48:00   -1             NULL   

现在奇怪的一点:

参加这个测试:

    public void FriendRequestTests()
    {
        var user22 = userRepository.FindById(22);
        Console.WriteLine(user22.FriendRequests.Count); // Count: 1

        var request = user22.FriendRequests[0];
        var friend = request.Friend; // Null
    }

问题是 request.Friend 为空(尽管所有其他值都已填充)

现在再次运行相同的测试,但首先获取 user18(但什么也不做)

    public void FriendRequestTests()
    {
                    var user18 = userRepository.FindById(18); // do nothing with this
        var user22 = userRepository.FindById(22);
        Console.WriteLine(user22.FriendRequests.Count); // Count: 1

        var request = user22.FriendRequests[0];
        var friend = request.Friend; // correct user (user18)
    }

我看到这种行为与朋友请求一致。如果之前在会话中访问过作为朋友的用户,则 request.Friend 不为空。如果在会话中从未访问过好友,则 request.Friend 始终为空。

是什么导致了这种奇怪,我该如何解决?
此外,有没有办法在映射中定义外键关系应该始终由左外连接获取?我知道 NHibernate 可以让你这样做,但 EF 对我来说是新的。

4

1 回答 1

2

尝试将您的导航属性设置为virtual

就像是

public class User
{
    public int Id { get; set; }

    public virtual ICollection<FriendRequest> FriendRequests { get; set; }
}

public class FriendRequest
{
    public int UserId { get; set; }
    public int FriendId { get; set; }

    public DateTime RequestDate { get; set; }

    public virtual User User { get; set; }
    public virtual User Friend { get; set; }
}

如果您延迟加载 ObjectContext,这可能会导致您的问题。

于 2012-05-29T10:28:55.157 回答