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上面。这里和第一个成功的有什么区别?

4

1 回答 1

1

我在这里看到的不同之处在于您的User实例是从数据库加载的,这意味着 EF 设置您的属性,包括导航集合(如果没有找到与此相关的关系,则使用空集合User)。但是,您的Message实例是在您的代码 ( new B.Models.Message { Message = text }) 中创建的,您的导航集合未初始化,因此当您尝试在其中添加项目时会出现异常。

我建议您在处理实体时始终在构造函数中初始化此类导航集合。

于 2013-10-28T14:56:06.357 回答