我在教程中看到了很多,导航属性为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的要求
#4楼
回答关于List<T>
:
List<T>
是一个类; 指定接口可以实现更高的灵活性。 更好的问题是“为什么不使用IList<T>
?”
要回答这个问题,请考虑IList<T>
对ICollection<T>
:整数索引,这意味着项目具有某些任意顺序,并且可以通过引用该顺序来进行检索。 在大多数情况下,这可能没有意义,因为在不同情况下可能需要对项目进行不同的排序。
#5楼
过去我所做的就是使用IList<Class>
, ICollection<Class>
或IEnumerable<Class>
(如果是静态列表)声明我的内部类集合,这取决于我是否必须在一个列表中执行以下任何操作我的存储库中的方法: 枚举,排序/排序或修改 。 当我只需要枚举(或排序)对象时,我将创建一个临时List<Class>
以在IEnumerable方法中使用该集合。 我认为这种做法只有在馆藏相对较小的情况下才会有效,但idk通常可能是一种好的做法。 如果有证据表明这样做不好,请纠正我。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3186690