C# 实体框架:为什么实体类的集合类型需要在默认构造函数中实例化?

C# 实体框架:为什么实体类的集合类型需要在默认构造函数中实例化?,c#,entity-framework,code-first,C#,Entity Framework,Code First,我正在使用Visual Studio自动构建NorthWind数据库的代码优先模型。我有一些问题 我发现,如果实体类有一个集合,那么集合总是在默认构造函数中实例化。我们为什么要这么做 ICollection在默认构造函数中被实例化为HashSet。为什么要使用HashSet?我可以使用列表或其他什么吗 为什么one侧的导航属性(一对多关系)是ICollection和virtual 要以我上面提到的方式实现实体类,我认为一定会带来一些好处。你能告诉我为什么吗 public partial clas

我正在使用Visual Studio自动构建NorthWind数据库的代码优先模型。我有一些问题

  • 我发现,如果实体类有一个集合,那么集合总是在默认构造函数中实例化。我们为什么要这么做

  • ICollection
    在默认构造函数中被实例化为
    HashSet
    。为什么要使用
    HashSet
    ?我可以使用
    列表
    或其他什么吗

  • 为什么one侧的导航属性(一对多关系)是
    ICollection
    virtual

  • 要以我上面提到的方式实现实体类,我认为一定会带来一些好处。你能告诉我为什么吗

    public partial class Orders
    {
        public Orders()
        {
            Order_Details = new HashSet<Order_Details>();
        }
        public virtual ICollection<Order_Details> Order_Details { get; set; }
    }
    
    公共偏序类
    {
    公共秩序
    {
    Order_Details=new HashSet();
    }
    公共虚拟ICollection Order_Details{get;set;}
    }
    
    我发现,如果实体类有一个集合,那么集合总是在默认构造函数中实例化。我们为什么要这么做

    你没有。只需要在开始添加内容之前对其进行实例化

    ICollection在默认构造函数中被实例化为哈希集。为什么使用HashSet?我可以用列表还是别的什么

    您可以使用实现ICollection的任何东西作为具体实现

    为什么“一方”(一对多关系)的导航属性是ICollection和virtual

    ICollection
    是EF期望用于导航属性的接口。它提供了表示该类型关系所需的最小接口。它是虚拟的,因此EF可以在运行时插入代理以检测对属性的更改。如果您决定不将其设置为虚拟,则需要手动通知EF有关属性更改的信息

    我发现,如果实体类有一个集合,那么集合总是在默认构造函数中实例化。我们为什么要这么做

    出于同样的原因,可以实例化类中的任何引用类型字段。当您第一次访问它时,它将是可用的,并且不会抛出NRE

    ICollection在默认构造函数中被实例化为哈希集。为什么使用HashSet?我可以用列表还是别的什么

    之所以使用
    HashSet
    ,是因为它保证两个彼此相等的值(通过查看它们的
    GetHashCode
    Equals
    方法检查相等性)在集合中只出现一次。 是的,您可以将具体类型更改为实现
    ICollection
    的任何类型

    为什么“一方”(一对多关系)的导航属性是ICollection和virtual


    因为如果某个对象具有一对多关系,这意味着每个实例(一个)将具有不同类型(多个)的集合。允许EF在运行时注入代理是虚拟的。

    我认为重要的是要注意,对于no.2,
    HasSet
    强制唯一性,而
    List
    可以有重复项。除非覆盖
    Equals
    GetHashCode
    ,否则Equals意味着引用等式。。。完全相同的对象实例的两个副本。值得一提的是,您通常不会遇到有实际差异的情况(或者至少我不会)。哈希集是一个仅包含唯一条目的集合,内部结构针对搜索进行了优化,而不是说列表-速度要快得多。查找给定对象实例的速度要快得多,例如,不是通过Id属性查找某个对象。
    使用HashSet是因为它保证唯一值在集合中只出现一次
    它保证完全相同的对象实例只出现一次(除非覆盖Equals和GetHashCode)。如果将两个属性值完全相同的不同对象实例添加到哈希集中,仍然会得到两个不同的条目。@Eric这就是“唯一值”的含义。我会澄清的。