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