我正在开发的网站采用标准社交网络范式: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 对我来说是新的。