我此看到很多的教程,具有导航性能ICollection<T>
这是实体框架的强制要求? 我可以使用IEnumerable
?
什么是使用的主要目的ICollection
,而不是IEnumerable
,甚至List<T>
我此看到很多的教程,具有导航性能ICollection<T>
这是实体框架的强制要求? 我可以使用IEnumerable
?
什么是使用的主要目的ICollection
,而不是IEnumerable
,甚至List<T>
通常你选择将取决于你需要访问哪些方法。 一般而言- IEnumerable<>
(MSDN: http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx )为对象的列表,仅需要通过,被迭代ICollection<>
MSDN: http://msdn.microsoft.com/en-us/library/92t2ye13.aspx ),选择那些需要通过迭代和修改的对象的列表, List<>
针对需要通过被迭代的对象的列表,修改,整理等(见这里的完整列表: http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx )。
从更具体的角度来看,延迟加载进来与选择类型的发挥。 默认情况下,在实体框架导航性能配备了更改跟踪并代理。 为了使动态代理作为一个导航属性来创建,虚拟类型必须实现ICollection
。
表示的关系中的“多”端的导航属性必须返回实现ICollection的,其中T是所述物体的在所述关系的另一端的类型的类型。 - 用于创建POCO代理MSDN要求
在定义和管理关系MSDN更多信息
ICollection<T>
被使用,因为IEnumerable<T>
接口提供没有添加项目,删除项目,或以其他方式修改集合的方式。
在回答你的问题关于List<T>
List<T>
是一类; 指定接口允许实现更大的灵活性。 一个更好的问题是“为什么不IList<T>
?”
为了回答这个问题,考虑什么IList<T>
增加ICollection<T>
整数索引,这意味着该物品具有一定的任意的顺序,并且可以通过参考该顺序进行检索。 这可能不是在大多数情况下有意义,因为可能的项目需要在不同的上下文不同的排序。
还有的ICollection和IEnumerable之间的一些基础知识差
简单的程序:
using System;
using System.Collections;
using System.Collections.Generic;
namespace StackDemo
{
class Program
{
static void Main(string[] args)
{
List<Person> persons = new List<Person>();
persons.Add(new Person("John",30));
persons.Add(new Person("Jack", 27));
ICollection<Person> personCollection = persons;
IEnumerable<Person> personEnumeration = persons;
//IEnumeration
//IEnumration Contains only GetEnumerator method to get Enumerator and make a looping
foreach (Person p in personEnumeration)
{
Console.WriteLine("Name:{0}, Age:{1}", p.Name, p.Age);
}
//ICollection
//ICollection Add/Remove/Contains/Count/CopyTo
//ICollection is inherited from IEnumerable
personCollection.Add(new Person("Tim", 10));
foreach (Person p in personCollection)
{
Console.WriteLine("Name:{0}, Age:{1}", p.Name, p.Age);
}
Console.ReadLine();
}
}
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name,int age)
{
this.Name = name;
this.Age = age;
}
}
}
使用的基本思想ICollection
是提供一个接口为只读访问到的数据的一些有限的量。 事实上,你有一个ICollection.Count财产。 IEnumerable
是更适合于其中阅读直到一些逻辑点的数据的一些链,一些条件esplicitly由消费者或直到枚举的端指定。
我记得是这样的:
IEnumerable的具有一个方法GetEnumerator(),它允许通过一个集合中的值来读取但不能写入。 大多数使用枚举的复杂性是由在C#中的每条语句照顾我们。 IEnumerable的有一个属性:当前,返回当前元素。
的ICollection实现IEnumerable,并增加了一些额外的性能最大程度地利用它的是伯爵。 将ICollection的通用版本实现了add()和删除()方法。
IList的同时实现IEnumerable和ICollection的,并添加到项目的整数索引访问(通常不是必需的,排序在数据库中完成)。
导航属性通常定义为虚拟的,这样他们可以利用某些实体框架的功能,例如迟缓装载。
如果导航属性可以容纳多个实体(如在许多一对多或一对一一对多关系),它的类型必须是哪些条目可以添加,删除和更新,如ICollection的列表。
https://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net- MVC应用程序
我在过去做的是申报使用我的内部类藏品IList<Class>
, ICollection<Class>
或IEnumerable<Class>
取决于我是否会做任何数量的以下的(如果静态列表)方法在我的仓库: 枚举,排序/顺序或修改 。 当我只需要在对象枚举(也许排序),那么我创建一个临时List<Class>
的IEnumerable的方法中使用的收集工作。 我想,如果集合相对较小这种做法只会是有效的,但它可能是很好的做法一般,IDK的。 如果有证据,为什么这会不是好的做法,请大家指正。