2012-05-29 62 views
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對我來說是新的。

回答

2

嘗試像

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; } 
} 

設置您的導航性能virtual

的東西,如果你懶加載你的ObjectContext的,這可能會造成您的問題。

+0

將它們設置爲虛擬沒有任何區別 – reach4thelasers