何时初始化实体中的集合属性
本文关键字:集合 属性 初始化 实体 何时 | 更新日期: 2023-09-27 18:37:11
我对初始化集合类型的导航属性感到困惑。在我在 Web 上看到的示例中,属性总是在类构造函数中显式初始化,但是在我的项目中,我有两组这样的属性,一组没有这种初始化,一个没有:
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.Received
null
上面。这里与第一个成功的有什么区别?
我在这里看到的区别在于您的User
实例是从数据库加载的,这意味着EF设置您的属性,包括导航集合(如果未找到此User
的关系,则为空集合)。但是,您的Message
实例是在代码中创建的(new B.Models.Message { Message = text }
),您的导航集合未初始化,因此当您尝试在其中添加项时会出现异常。
我建议您在处理实体时始终在构造函数中初始化此类导航集合。