2010-12-14 2 views
1

EF 4에 일반 저장소를 작성하려고합니다. 그러나 코드가 좋지 않습니다. ExpressionEntities가 GENERIC이 아니기 때문입니다.EF4에서 생성자에 일반 엔터티 이름을 쓰는 방법은 무엇입니까?

public class DataRepository<T> : IRepository<T> where T : class 
{ 
    private GetGenericEntityCONTEXT _context; 

    public DataRepository() 
    { 
    } 

    public DataRepository(GetGenericEntityCONTEXT context) 
    { 
     _context = context; 
    } 
} 

내 엔티티를 글로벌하지 ExpressionsEntities 때문에 : ExpressionsEntities1, ExpressionsEntities 2, ExpressionsEntities 3 ETX는 ... 내가 필요 다음에

public class DataRepository<T> : IRepository<T> where T : class 
{ 
    private ExpressionsEntities _context; 
    public DataRepository() 
    { 
    } 

    public DataRepository(ExpressionsEntities context) 
    { 
     _context = context; 
    } 
} 

:

나는이 코드를 변환 할 쓰기 엔티티 가져 오기 예 :

public class DataRepository<T> : IRepository<T> where T : class 
{ 
    private Entity _context; 
    public DataRepository() 
    { 
    } 

    public DataRepository(Entity context) 
    { 
     _context = context; 
    } 

    public class Main 
    { 
     main() 
     { 
      new DataRepository(ExpressionEntities) 
     } 
    } 
} 

답변

1

100 % 확실하지 않습니다. 모자 당신 물어 - 내가 이해할 수있는, 당신이 할 수있는 방법을 wan't에서 동적으로 쉽게 충분 T.

음에 따라 엔티티 집합 생성 : 그런 다음 특정 저장소

public class DataRepository<T> : IRepository<T> where T : class 
{ 
    private ObjectContext _ctx; 

    public DataRepository<T>(ObjectContext ctx) 
    { 
     this._ctx = ctx; 
    } 

    public IObjectSet<T> CurrentEntitySet<T>() 
    { 
     get 
     { 
      var entityName = _plularizer.Pluralize(typeof(T).Name); 
      string entitySetName = string.Format("{0}.{1}", EntityContainerName, entityName); 
      return _ctx.CreateObjectSet<T>(entitySetName); 
     } 
    } 
} 

을 (예를 들어)이 작업을 수행 할 수 있습니다 :

public class AppleRepository : DataRepository<Apple> 
{ 
    public AppleRepository(IObjectContext ctx) : base(ctx) {} 

    public ICollection<Apple> FindApples(Func<Apple,bool> predicate) 
    { 
     return CurrentEntitySet.Where(predicate).ToList(); 
    } 
} 

그리고 당신이 당신의 저장소를 만들 때 개체 컨텍스트를 통과 - 바람직 DI에 의해을 :

var repository = new AppleRepository(new ExpressionEntities()); // should be DI'ed 

기본적으로, 우리는 복수화 (동일한 엔티티 집합 이름을 복수형으로하는 엔티티 프레임 워크에 의해 사용되는 코드), 그리고 CreateObjectSet<T>을 활용하고 있습니다.

그래서 당신이 DataRepository<Apple>을 만든 경우, 즉 사과의 엔티티 세트 이름에 번역 것이고, 우리는 그 기반으로 엔티티 세트를 작성 (엔티티가 모델 설정과 일치해야합니다).

EntityContainerName 속성이 EDMX의 속성입니다.이 속성은 ctor (DI를 통해 선호)를 통해 전달해야합니다.

질문에 대한 답변이 있습니까?

+0

위의 코드를 참조하십시오. 내 코드는 generic이지만 ExpressionsEntities는 위 코드에 따라 일반이 아닙니다. 모든 항목을 작성해야합니다. – Penguen

+0

@Phsika - "ExpressionEntities"는 데이터 컨텍스트입니까? 나는 추측을하고 예라고 말하고 대답을 업데이트 할 것입니다. – RPM1984

+0

아니요, 엔티티마다 저장소가 필요하지 않습니다. 집계 루트 * 당 저장소 *가 있어야합니다.각 집계 루트에 대한 인터페이스를 만들고 DataRepository 또는 특정 리포지토리 (DataRepository 에서 파생되므로 인터페이스 계약을 충족 함)를 주입합니다. 일반적인 저장소의 요점은 구현 횟수를 줄이는 것입니다. – RPM1984

1

저는 이처럼 entityName을 얻는 것을 선호합니다. EntitySetBase entitySet = container.BaseEntitySets.Where(item => item.ElementType.Name.Equals(typeof(T).Name)).FirstOrDefault();

var entityName = entitySet.Name

당신이 복수로 일부 수업을 경우는 어떤 경우를 다루는

EntityContainer container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace);

, 일부 클래스 없습니다.

관련 문제