2013-10-28 36 views
0

我對初始化屬於集合類型的導航屬性感到困惑。在例子我在網上看到的,屬性始終明確地在類的構造函數初始化,但是在我的項目我有兩套這樣的屬性,並沒有這樣的初始化一個工作,一個不:何時初始化實體中的集合屬性?

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

    [System.ComponentModel.DataAnnotations.Schema.InverseProperty("Requested")] 
    public virtual System.Collections.Generic.ICollection<Friendship> RequestedFriendships { get; set; } 

    [System.ComponentModel.DataAnnotations.Schema.InverseProperty("Received")] 
    public virtual System.Collections.Generic.ICollection<Message> ReceivedMessages { get; set; } 
} 

public class Message 
{ 
    public int MessageId { get; set; } 
    string Message { get; set; } 
    public virtual System.Collections.Generic.ICollection<User> Received { get; set; } 
} 

public class Friendship 
{ 
    public int FriendshipId { get; set; } 
    public int RequestedUserId { get; set; } 
    public virtual User Requested { get; set; } 
} 

以下工作:

db.Users.Single(u => u.UserId == userId).RequestedFriendships.Add(new B.Models.Friendship 
{ 
    RequestedUserId = userId, 
}); 

同樣在此:

B.Models.Message message = db.Messages.Add(new B.Models.Message 
{ 
    Message = text 
}); 
db.SaveChanges(); 

但是按照上述的下面失敗:

message.Received.Add(db.Users.Single(u => u.UserId == userId)); 

由於message.Receivednull以上。第一個成功的有什麼不同?

回答

0

我在這裏看到的區別是,您的User實例是從數據庫加載的,這意味着EF會設置您的屬性,包括導航集合(如果找不到此User的關係,則爲空集合)。但是,您的Message實例是在您的代碼(new B.Models.Message { Message = text })中創建的,您的導航集合未初始化,因此當您嘗試添加項目時會收到​​異常。

我建議你在處理實體時總是在構造函數中初始化這樣的導航集合。