2012-12-22 1 views
5

MVC4와 엔티티 프레임 워크 5를 사용하고 있으며 많은 테이블을 가지고 있습니다. 우리 프로젝트의 규칙으로, 우리는 데이터베이스에서 어떤 레코드도 삭제하지 않으며, 각 레코드는 isActive 필드를 가지며, 그 필드가 false이면 삭제 된 것으로 간주합니다. 내가 활성 기록을 얻을 확장 방법을 쓰고 싶었다 일부 인터넷 검색 후 나는이 쓴 :내 경우에는 확장 방법을 사용하는 것이 옳은가요?

public static IQueryable<Company> GetAll(this IQueryable<Company> source) 
{ 
    return source.Where(p => p.isActive); 
} 

가 지금은

Context db = new Context(); 
db.Company.GetAll(); 

같은 활성 기록을 얻기 위해 내 확장 방법을 사용하지만,의 내가 말을 할 수 있습니다 내 데이터베이스에 50 개 이상의 테이블이 있는데, 각 테이블에 대해 동일한 확장 메소드를 작성하는 것이 좋습니다. 모든 테이블에 대해서 단 하나의 GetAll() 확장 메소드를 작성하는 더 좋은 방법이 있습니까? 실제로이 인스턴스의 확장 메서드를 사용하는 것이 올바른지 잘 모르겠다.

누군가 저를 도우려고하고 올바른 방법을 보여줄 수 있습니까? 코드 예제에 도움을 주시면 감사하겠습니다.

답변

1

일반 생성기에 의존하는 경우 Entity Framework를 사용하는 방법에 따라 다르지만 사례가 더 어려워지고 유사한 사례 연구가 없었습니다. 하지만 일반적인 POCO 클래스 생성기를 사용하는 경우 기본 클래스를 사용하여 다른 클래스 (테이블)의 기본 클래스 인 CEntity이라고합시다.

아직 없습니까? 아니, 난 저장소 패턴을 사용하는 것을 선호이 계속합니다, 당신은 그 저장소 일반 (CEntity)를 만들 수 있습니다, 예를 들어 :

public class Repository<CEntity> where CEntity : class 
{ 
    public IQueryable<CEntity> GetAll() 
    { 
     return source.Where(p => p.isActive); 
    } 

} 

을 그리고 이것은 그것을 사용하는 방법은 다음과 같습니다

Repository<Company> com = new Repository<Company>(); 
Repository<Employee> emp = new Repository<Employee>(); 

var coms = com.GetAll(); // will get all ACTIVE companies 
var emps = emp.GetAll(); // will get all ACTIVE employees 

내 머리 꼭대기에서 벗어났습니다. 다른 문제가 있으면 의견을 남기고 기꺼이 도와주세요. 그냥 관심의 포인트로

+0

신속한 답변 LordCover에 감사드립니다. 나는 데이터베이스의 첫 번째 접근법을 사용한다. EF5.x DbContextGenerator는 일반적인 POCO 클래스 생성기입니까? 정상적인 POCO 클래스 생성기는 어디에서 찾을 수 있습니까? 그건 그렇고, 당신의 예제에서는 "소스"에 대한 정의가 없습니다. – cck

+0

알다시피,'source'는 객체의 집합 인 객체 집합입니다. –

+0

그러나 어떻게 그것이 활성 필드를 가지고 있다고 말합니까? 컴파일러에서 "no such field"와 같은 오류를 발생시킵니다. 나는 내가 Company 클래스에 던져야한다고 생각한다. 그러나 아무것도 바뀌지 않을 것이다, 그리고 나는 모든 나의 테이블을 위해 그것을해야 할 것이다? – cck

1

, 이쪽은 내 데이터 레이어를 구현하는 방법을 정확하게, 그리고 나는 그것 :)

나는 또한뿐만 아니라 중간에 저장소를 잼 멋진 생각하지만, 일반적인 개념은 작업 또는한다 없이.

다음은 유사한 사용 사례에 대한 내 블로그에서이 메서드를 사용하는 방법에 대한 몇 가지 작업 코드 예제입니다.

https://github.com/lukemcgregor/StaticVoid.Blog/blob/master/Blog/Data/Entities/Post/PostRepositoryExtensions.cs

나는 아직도 당신이 너무 많이 할 수있는 것을 제한하지하면서 꽤 고급 코드를 만드는 것으로 나타났습니다. 내가 말했듯이, 나는이 방법이 굉장하고 정말로 그것의 사용법을 추천한다고 생각한다.

+0

예를 들어 프로젝트 루크에 감사드립니다. 내가 이해하지 못했던 (아마도 더) 오웬이 있습니다. 데이터베이스 컨텍스트 클래스가 각 리포지토리에 대해 만들어 지거나 리포지토리가 하나의 데이터베이스 컨텍스트 클래스를 공유합니까 (하나의 컨텍스트 만 생성합니까?)? – cck

+0

예 제가 제네릭 리포지토리를 사용할 때 예제가 좀 더 복잡하다고 가정합니다. 아래에는 하나의 DbContext (https://github.com/lukemcgregor/StaticVoid.Blog/blob/master/Blog/Data/BlogContext.cs)가 있지만 실제로 작동하는 경우 리포지토리를 사용하지 않고 동일한 확장 메서드를 실제로 수행 할 수 있습니다 IQueriable 또는 IDbSet 까지 확장하면 더 좋습니다. –

관련 문제