2011-03-27 3 views
1

에 의해 엔티티를 검색하기위한 일반적인 방법 :엔티티 프레임 워크 4 - 나는 자신의 ID로 하나의 엔티티를 가져 오는위한 방법을 쓰고 있어요 ID

public Customer GetCustomer(int i_CustomerID) 
{ 
    return (from c in context.CustomerSet 
     where c.Id == i_CustomerID 
     select c).SingleOrDefault();    
} 

public Movie GetMovie(int i_MovieID) 
{ 
    return (from m in context.MovieSet 
     where m.Id == i_MovieID 
     select m).SingleOrDefault(); 
} 

는하지만 많은 요소를 가지고 있고이 코드가 반복된다. 다음과 같은 메서드를 작성하고 싶습니다.

public T GetEntityByID<T>(int i_EntityID) 
{ 
    return (from e in context.T_Set 
     where e.Id == i_EntityID 
     select e).SingleOrDefault(); 
} 

구현 방법이 있습니까?

+0

비슷한 질문이 있습니다. [여기] (http://stackoverflow.com/questions/248682/create-llblgen-linq-query-dynamicly-with-strings) – Menahem

답변

3

나는 실제로 실행하지 않은하지만 컴파일하고 아마 당신이 달성하려고하는 일의 라인을 따라 뭔가 :

public static void Testing() 
    { 
     SelectEntity<MyObject>(r => r.MyObjectId == 1); 
    } 

    public static T SelectEntity<T>(Expression<Func<T, bool>> expression) where T : EntityObject 
    { 
     MyContext db = new MyContext(); 
     return db.CreateObjectSet<T>().SingleOrDefault(expression); 
    } 
+0

좋은 해결책이지만 마음에 들지 않습니다. 람다를 사용하는 아이디어. 어떻게 든 int를주고 싶습니다. –

+0

MyEntity.PrimaryId라고 말하기 위해 기본 키를 연결하는 인터페이스 (예 : IPrimaryKey)를 구현하는 엔티티의 두 번째 부분 클래스를 선언 한 다음 T : IPrimaryKey 인 일반 메소드를 만들 수 있습니다. 또는 EntityKey 사용을 고려 했습니까? 엔티티 키 정보에서 기본 키를 찾아내는 것이 가능할 수도 있습니다 ... – Rob

1

문제는 사용자가 추구하는 관련 속성을 가진 일반적인 수퍼 유형이 없다는 것입니다. 그러나 EF가 사용하는 내장 T4 코드 생성 도구를 사용하여 가져 오기 메소드를 생성하는 것은 쉽습니다. 여기에 필요한 코드를 연결하여 생성하는 방법에 대한 좋은 링크가 있습니다.

http://msdn.microsoft.com/en-us/data/gg558520

0

을 당신이 당신의 일반적인 저장소가 될 것이라고 알고 있다면 같은 이름과 같은 타입의 PK를 가진 엔티티 타입과 함께 사용하면 다음과 같이 간단하게 인터페이스를 정의 할 수 있습니다 :

public interface IEntity 
{ 
    int Id { get; } 
} 

d 생성 된 엔티티의 부분 부분에이 인터페이스를 구현하거나 T4 템플릿을 수정하여 자동으로 포함시킵니다. PK의 유형을 변경할 수있는 경우

public interface IRepository<TEntity> where T : IEntity 
{ 
    ... 
} 

하지만 이름은 아직도 당신의 개체 인터페이스를 향상시킬 수 있습니다 동일합니다 : 귀하의 저장소는 다음과 같이 정의 될 것이다

public interface IEntity<TKey> 
{ 
    TKey Id { get; set; } 
} 

및 저장소의 정의를 수 : 당신이 다른 PK의 이름을 가진 기관과 협력 this answer를 확인 입력 할 수있는 일반적인 저장소를 원하는 경우

public interface IRepository<TEntity, TKey> where TEntity : IEntity<TKey> 
{ 
    ... 
} 

. 이 솔루션은 복합 PK로 작동 할 수도 있습니다 (또는 작은 수정으로).

+0

이것은 어떤 작업을 저장하는 많은 작업처럼 보입니다 :-) –

+0

왜 IRepository가 필요합니까? 어떻게 사용합니까? –

+0

저장소는 데이터 계층을 추상화하는 데 사용되는 패턴입니다. 생각하면 DBContext와 같은 일을합니다. – Burt

관련 문제