为什么使用ICollection而不是IEnumerable或List <T> 在多对多/一对多关系上?

雨燕双飞 提交于 2020-03-03 17:09:13

我在教程中看到了很多,导航属性为ICollection<T>

这是对实体框架的强制性要求吗? 我可以使用IEnumerable吗?

使用ICollection而不是IEnumerable甚至List<T>的主要目的是什么?


#1楼

ICollection<T>是因为IEnumerable<T>接口没有提供添加项目,删除项目或修改集合的方式。


#2楼

使用ICollection的基本思想是提供一个接口,以只读方式访问一定数量的数据。 实际上,您具有ICollection.Count属性。 IEnumerable更适用于某些数据链,在这些数据链中您读取直到某个逻辑点,使用者明确指定的某些条件或枚举结束为止。


#3楼

通常,您选择的内容取决于您需要使用的方法。 通常, IEnumerable<> (MSDN: http : //msdn.microsoft.com/zh-cn/library/system.collections.ienumerable.aspx )用于仅需要迭代的对象列表, ICollection<> ( MSDN: http : //msdn.microsoft.com/zh-cn/library/92t2ye13.aspx ),列出了需要迭代和修改的对象, List<>列出了需要迭代的对象。 ,修改,排序等(有关完整列表,请参见此处: http : //msdn.microsoft.com/en-us/library/6sh2ey19.aspx )。

从更具体的角度来看,延迟加载可以选择类型。 默认情况下,实体框架中的导航属性带有更改跟踪,它们是代理。 为了将动态代理创建为导航属性,虚拟类型必须实现ICollection

表示关系的“许多”端的导航属性必须返回实现ICollection的类型,其中T是关系的另一端的对象的类型。 - 创建POCO代理MSDN的要求

有关定义和管理关系的更多信息, MSDN


#4楼

回答关于List<T>

List<T>是一个类; 指定接口可以实现更高的灵活性。 更好的问题是“为什么不使用IList<T> ?”

要回答这个问题,请考虑IList<T>ICollection<T> :整数索引,这意味着项目具有某些任意顺序,并且可以通过引用该顺序来进行检索。 在大多数情况下,这可能没有意义,因为在不同情况下可能需要对项目进行不同的排序。


#5楼

过去我所做的就是使用IList<Class>ICollection<Class>IEnumerable<Class> (如果是静态列表)声明我的内部类集合,这取决于我是否必须在一个列表中执行以下任何操作我的存储库中的方法: 枚举,排序/排序或修改 。 当我只需要枚举(或排序)对象时,我将创建一个临时List<Class>以在IEnumerable方法中使用该集合。 我认为这种做法只有在馆藏相对较小的情况下才会有效,但idk通常可能是一种好的做法。 如果有证据表明这样做不好,请纠正我。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!