0
我正在使用的網站採用標準的社交網絡Paradigm: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爲空(雖然被填充其他所有值)
現在再次運行同樣的測試,但首先獲取用戶18(但是什麼也沒做)
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對我來說是新的。
將它們設置爲虛擬沒有任何區別 – reach4thelasers