ICollection <T> Vs List <T>在entity framework中
在我开始devise几个entity framework应用程序之前,我只观看了一些networking广播。 我真的没有阅读那么多的文档,现在我觉得我很痛苦。
我已经在我的课程中使用List<T>
,并且工作得很好。
现在我已经阅读了一些文档,并指出我应该使用ICollection<T>
。 我改变了这一点,甚至没有引起模型上下文的改变。 这是因为这两个List<T>
和ICollection<T>
inheritanceIEnumerable<T>
,这是EF实际需要什么?
但是,如果是这种情况,为什么EF文档没有声明它需要IEnumerable<T>
而不是ICollection<T>
?
无论如何,我所做的还有什么缺点,还是应该改变呢?
entity framework将使用ICollection<T>
因为它需要支持Add
操作,它们不是IEnumerable<T>
接口的一部分。
另外请注意,您使用的是ICollection<T>
,您只是将其作为List<T>
实现公开。 List<T>
带来它IList<T>
, ICollection<T>
和IEnumerable<T>
。
至于你的改变,尽pipeList<T>
工作,通过接口暴露是一个不错的select。 接口定义合同,但不是实现。 实施可能会改变。 在某些情况下,例如,实现可能是HashSet<T>
。 (顺便提一下,这是一个你可以使用的不仅仅是entity framework的思想体系,一个好的面向对象的实践是编程接口而不是实现,实现可以并且将会改变。
他们select了他们所做的接口,因为它可以让你理解entity framework在使用Linq时执行的奇妙查询的一个可理解的抽象。
以下是接口之间的区别:
-
IEnumerable<T>
是只读的 - 您可以添加和删除项目到
ICollection<T>
- 您可以随机访问(通过索引)到
List<T>
除此之外, ICollection
和IEnumerable
很好地映射到数据库操作,因为查询和添加/删除实体是您可能在数据库中执行的操作。
索引的随机访问也没有映射,因为你必须有一个现有的查询结果迭代,或每个随机访问将再次查询数据库。 另外,索引映射到什么地方? 行号? 没有太多的行号查询是你想要做的,而且在构build更大的查询中是没有用的。 所以他们根本不支持它。
ICollection<T>
被支持,并且允许你查询和修改数据,所以使用它。
List<T>
起作用的原因是因为EF实现最终返回一个。 但是,这是在你的查询链的末尾,而不是在一开始。 因此,使您的属性ICollection<T>
将更明显,EF创build了一堆SQL,最后只返回一个List<T>
,而不是做你使用的每个级别的Linq的查询。
ICollection与IEnumerable的不同之处在于,您实际上可以将项目添加到集合中,而使用IEnumerable则不能。 因此,例如,在您的POCO类中,如果您打算允许添加集合,则需要使用ICollection。 让ICollection虚拟化也可以从延迟加载中受益。
尽pipe这个问题早在几年前就已经发布,但是当有人正在寻找同样的情况时,它仍然是有效的。
最近有一个[2015年] CodeProject文章,详细解释了示例代码与graphics表示的不同之处。 这不是直接针对EF,而是希望能有更大的帮助:
列表与IEnumerable与IQueryable与ICollection与IDictionary