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>

除此之外, ICollectionIEnumerable很好地映射到数据库操作,因为查询和添加/删除实体是您可能在数据库中执行的操作。

索引的随机访问也没有映射,因为你必须有一个现有的查询结果迭代,或每个随机访问将再次查询数据库。 另外,索引映射到什么地方? 行号? 没有太多的行号查询是你想要做的,而且在构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