C# EntityFramework CodeFirst实例化集合

C# EntityFramework CodeFirst实例化集合,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我有一个带有集合的EntityFramework对象,例如: public class User { public virtual ICollection<Page> Pages { get; set; } } 最佳实践是什么?保持这种状态,或者在构造函数中实例化集合,或者其他什么?如果我将集合实例化为默认的空白列表,如下所示: public class User { public virtual ICollection<Page> Pages { ge

我有一个带有集合的EntityFramework对象,例如:

public class User
{
    public virtual ICollection<Page> Pages { get; set; }
}
最佳实践是什么?保持这种状态,或者在构造函数中实例化集合,或者其他什么?如果我将集合实例化为默认的空白列表,如下所示:

public class User
{
    public virtual ICollection<Page> Pages { get; set; }

    public User()
    {
        Pages = new List<Page>();
    }
}

然后,我收到一条关于在构造函数中实例化虚拟属性的DevExpress/代码分析警告-这样做有危险吗?

不要实例化它,保持POCO对象不变,让EF按预期对其进行操作。EF将为您实例化它们。您应该知道EF将通过动态代理填充由virtual标记的导航属性。

这将是一个更好的决定:

private readonly IList<Page> _page;

public User(IEnumerable<Page> page)
{
    _page = new List<Page>(page);
}

public IList<Page> Page
{
    get { return _page; }
}

使用about ICollection、IEumerable和IList时要小心,请参阅更多信息

如果对象是预先存在的,则此操作有效,但最初创建对象时又如何?如果没有在构造函数中实例化每个对象,那么您必须在手动创建对象时实例化继承链上的所有集合,或者在执行LINQ查询之前检查以确保每个ienumerable不为null?但是我认为EntityFramework仅与ICollections兼容?或者ISet set=new HashSet