2011-01-04 2 views
1

Entity Framework 4 프로젝트 내에 '고객'POCO 엔터티가 있습니다. 내 Customer 엔티티를 ObjectSet이 아닌 generic리스트로 상위 레이어에 노출하고 싶습니다.EntityFramework 4 개체를 IObjectSet 대신 IList로 표시

나는 다음과 같이 보이는 IUnitOfWork 인터페이스가 :

나는 다음과 같은 한 (위의 인터페이스를 구현) 내 엔티티 프레임 워크 DAL에서 아래로
public interface IUnitOfWork 
{ 
    string Save(); 
    IList<Customer> Customers { get; } 
} 

:

public class EntityContainer : ObjectContext, IUnitOfWork 
{ 
    private IObjectSet<Customer> _customers; 

    public IList<Customer> Customers 
    { 
     get 
     { 
     if (_customers == null) 
     { 
      _customers = CreateObjectSet<Customer>("Customers");      
     } 
     return _customers.ToList<Customer>() ; 
     }    
    } 
} 

그러나 'CreateObjectSet ("고객") '선이 작동하지 않습니다. 새로운 '고객'을 추가하려고 할 때마다 아무 일도 일어나지 않습니다. 흥미롭게도 IObjectSet을 사용하면 코드가 작동합니다. 예 :

public interface IUnitOfWork 
{ 
    string Save(); 
    IObjectSet<Contact> Contacts { get; } 
} 


public class EntityContainer : ObjectContext, IUnitOfWork 
{ 
    private IObjectSet<Customer> _customers; 

    public IObjectSet<Customer> Customers 
    { 
     get 
     { 
     if (_customers == null) 
     { 
      _customers = CreateObjectSet<Customer>("Customers");      
     } 
     return _customers; 
     }    
    } 
} 

IQueryable도 작동하지만 IList를 사용할 수 없으며 이유가 없습니다. 누구든지 어떤 아이디어?

#

원래 질문에 대한 수정. IQueryable을 사용하면 IEnumerable이 작동하지 않으며 작동하지 않습니다. 이는 고객 저장소가 엔티티 컬렉션에서 추가/삭제 (위의 예에서 고객 엔티티 추가 또는 제거)하기 위해 '추가'및 '삭제'메소드를 제공해야하기 때문입니다. IQueryable 또는 IEnumerable을 사용하면 개체를 추가하거나 제거 할 수 없습니다. 대신 ICollection 또는 IList를 사용해야합니다. 이 때문에 원래의 문제가 다시 해결됩니다. 내 컬렉션을 ObjectSet으로 저장소에 노출하고 싶지 않습니다. EntityFramework에 묶이지 않은 유형을 사용하고자합니다. 즉, 일반 목록을 사용하고 싶습니다.

더 많은 제안이 있습니까? 이 작업을 수행하는 간단한 방법이 있다고 생각하지만 프레임 워크에 익숙하지 않아서 알아낼 수 없습니다.

+1

'IEnumerable '은 훨씬 더 일반적인 단어입니다. –

답변

1

_customers.ToList()는 범인입니다. ToList는 쿼리를 실행하고 해당 쿼리의 모든 항목을 새 컬렉션 개체로 복사합니다. 이 새 컬렉션 객체는 ObjectSet에있는 추적 기능을 제공하지 않습니다.

+0

좋아, 좋은 정보 덕분에.귀하의 의견과 저스틴의 이전 게시를 기반으로 IEnumerable , IQueryable 을 사용하거나 ObjectSet에 대한 변경 사항이 변경된 후 내 코드의 다른 지점에서 IList로 변환을 수행해야합니다. 더 이상 ObjectSet의 추적 기능에 신경 쓰지 마십시오. 다시 한 번 감사드립니다! – JMc

+0

@JMc - 문제 없습니다. 수락 된 것으로 내 대답을 표시 할 수 있습니까? thx –

+0

나는 사랑할 것이다. 그러나 나는 아직도이 문제를 시험하고있다. 이전에 IQueryable이 작동한다고 언급했을 때 나는 틀 렸습니다. 내 '찾기()'방법은 IQueryable과 작동하지만 IEnumerable에 추가 할 수 없기 때문에 고객 리포지토리의 '추가'및 '삭제'메소드가 작동하지 않습니다. 이를 위해서는 ICollection 또는 IList를 사용해야하는데, 원래의 문제점을 다시 해결해줍니다. 엔티티를 내가 추가하고 제거 할 수있는 콜렉션으로 노출해야하지만 ObjectSet 유형을 사용할 수는 없습니다. 어떤 제안? – JMc

2

이 모든 경우 저장소가 누락 된 것 같습니다. 리포지토리는 일반적으로 ObjectSet<T>에서 IList<T> (또는 대부분의 경우 IEnumerable<T> 또는 IQueryable<T>)의 변환을 처리합니다.

public class EntityContainer : ObjectContext 
{ 
    private IObjectSet<Customer> _customers; 

    public IObjectSet<Customer> Customers 
    { 
     get 
     { 
      return _customers ?? 
       (_customers = CreateObjectSet<Customer>("Customers"); 
     } 
    } 
} 

public class CustomerRepository 
{ 
    EntityContext _context = new EntityContext(); 

    public IQueryable<Customer> FindAll() 
    { 
     return _context.Customers; 
    } 

    public Customer FindById(int id) 
    { 
     return _context.Customers.Single(c => c.Id == id); 
    } 

    // And so on. 
} 

나는 보통 다음 내 UnitOfWork에이 저장소를 통해 이루어 아무것도 한 번의 작업으로 번들되도록 작업 단위에 입대해야하는 저장소를 만들 수 있습니다.

내 UnitOfWork에는 두 가지 방법 만 있습니다. 하나는 저장소를 얻기위한 것이고 다른 하나는 작업 단위를 커밋하는 것입니다. 모든 데이터 검색은 리포지토리에서 처리합니다.

+0

안녕하세요, 저는 저장소 또는 작업 단위 (Unit of Work)를 놓치지 않았습니다. 그러나 아주 간단하고 예상대로 작동하고 있기 때문에 여기서는 언급하지 않았습니다. 내 패턴은 실제로 위에서 묘사 한 것입니다. 일반적으로 ObjectSet에서 IList로 변환하기 위해 저장소를 사용한다고 가정 해 보겠습니다. Entity Framework 레벨 덕분에 변환을 수행하는 대신이 방법을 시도해 볼 수 있습니다. – JMc