[C#] 많은 / 일대 다 관계에서 IEnumerable 또는 List <T>가 아닌 ICollection을 사용하는 이유는 무엇입니까?

내비게이션 속성이와 같은 자습서 에서이 내용을 많이 볼 수 ICollection<T>있습니다.

이것이 Entity Framework의 필수 요구 사항입니까? 사용할 수 있습니까 IEnumerable?

ICollection대신 IEnumerable또는 심지어 사용하는 주요 목적은 무엇입니까 List<T>?



답변

일반적으로 선택하는 것은 액세스해야하는 방법에 따라 다릅니다. 일반적으로- IEnumerable<>(MSDN : http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx )를 통해 반복해야하는 개체 목록 ICollection<>(MSDN : http : // msdn.microsoft.com/ko-kr/library/92t2ye13.aspx )를 통해 반복 및 수정 List<>해야하는 개체 목록, 반복, 수정, 정렬 등을 수행해야하는 개체 목록 (여기 참조) 전체 목록 : http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx ).

보다 구체적인 관점에서, 유형 선택에 따라 지연 로딩이 발생합니다. 기본적으로 Entity Framework의 탐색 속성에는 변경 내용 추적 기능이 있으며 프록시입니다. 동적 프록시를 탐색 특성으로 작성하려면 가상 유형 구현 되어야 합니다 ICollection.

관계의 “많은”끝을 나타내는 탐색 속성은 ICollection을 구현하는 형식을 반환해야합니다. 여기서 T는 관계의 다른 쪽 끝에있는 개체의 형식입니다. – POCO 프록시 생성을위한 요구 사항 MSDN을

관계 정의 및 관리 MSDN 에 대한 추가 정보


답변

ICollection<T>IEnumerable<T>인터페이스는 항목을 추가하거나 제거하거나 컬렉션을 수정하는 방법을 제공하지 않기 때문에 사용됩니다 .


답변

에 대한 귀하의 질문에 답변 List<T>:

List<T>클래스입니다. 인터페이스를 지정하면 구현의 유연성이 향상됩니다. 더 좋은 질문은 “왜 안돼 IList<T>?”입니다.

이 질문에 답하려면 정수 인덱싱에 IList<T>추가 할 ICollection<T>항목 을 고려하십시오 . 즉, 항목에 임의의 순서가 있으며 해당 순서를 참조하여 검색 할 수 있습니다. 항목은 다른 상황에서 다르게 주문해야하기 때문에 이것은 대부분의 경우 의미가 없습니다.


답변

ICollection과 IEnumerable 간에는 몇 가지 기본 차이점이 있습니다.

  • IEnumerable -Enumerator를 가져 오기 위해 GetEnumerator 메소드 만 포함하며 루핑을 허용합니다.
  • ICollection 에는 추가, 제거, 포함, 개수, CopyTo와 같은 추가 메서드가 포함됩니다.
  • ICollection 은 IEnumerable에서 상속됩니다.
  • ICollection을 사용하면 add / remove와 같은 메소드를 사용하여 콜렉션을 수정할 수 있습니다. 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;
        }
    }
}


답변

이런 식으로 기억합니다.

  1. IEnumerable에는 컬렉션의 값을 읽을 수는 있지만 쓸 수는없는 GetEnumerator () 메서드가 있습니다. 열거자를 사용하는 복잡성의 대부분은 C #의 각 문마다 처리됩니다. IEnumerable에는 Current 요소가 하나 있는데 현재 요소를 반환합니다.

  2. ICollection은 IEnumerable을 구현하고 가장 많이 사용되는 속성이 Count 인 몇 가지 추가 속성을 추가합니다. ICollection의 일반 버전은 Add () 및 Remove () 메서드를 구현합니다.

  3. IList는 IEnumerable과 ICollection을 모두 구현하고 항목에 정수 색인 액세스를 추가합니다 (주문이 데이터베이스에서 수행 될 때 일반적으로 필요하지 않음).


답변

사용의 기본 아이디어는 ICollection유한 한 양의 데이터에 대한 읽기 전용 액세스를위한 인터페이스를 제공하는 것입니다. 실제로 ICollection.Count 속성이 있습니다. IEnumerable논리적 지점, 소비자가 암시 적으로 지정한 조건 또는 열거의 끝까지 읽는 일부 데이터 체인에 더 적합합니다.


답변

탐색 속성은 일반적으로 지연로드와 같은 특정 Entity Framework 기능을 활용할 수 있도록 가상으로 정의됩니다.

탐색 특성이 여러 엔티티 (다 대다 또는 일대 다 관계에서와 같이)를 보유 할 수있는 경우 해당 유형은 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- 응용