2012-05-13 2 views
2

EntityFramework 4.3을 사용하여 엔티티를 데이터베이스에 연결하고 저장하는 재사용 가능한 데이터베이스 리포지토리 방법을 연구 중입니다.C#에서 제네릭 형식의 요소에 액세스하는 방법

private void SaveObject<T>(T entityToSave, DbSet<T> dbSet) where T : class 
    { 
     if (db.Entry(entityToSave).State == EntityState.Detached) 
     { 
      if (entityToSave.Id == Guid.Empty) // how do I access the Id property? 
       dbSet.Add(entityToSave); 
      else 
       db.Entry(entityToSave).State = EntityState.Modified; 
     } 
    } 

내가 실행 해요 문제는 그 속성이 이드 그래서 그것을이 설정되지 않았거나 있는지 확인할 수 있습니다 내 방법을 알 필요가있다. 그것이 비어 있다면, 나는 새로운 레코드를 만들고 있다는 것을 압니다. 그렇지 않으면 기존 레코드를 수정합니다.

Id 속성에 내 메서드를 어떻게 전달합니까?

답변

3

Id 속성을 정의하는 인터페이스 또는 기본 클래스가 필요하며이를 제네릭 제약 조건으로 사용하십시오. 예 :

public interface IEntity 
{ 
    Guid Id { get; } 
} 

private void SaveObject<T>(T entityToSave, DbSet<T> dbSet) where T : class, IEntity 
    { 
     if (db.Entry(entityToSave).State == EntityState.Detached) 
     { 
      if (entityToSave.Id == Guid.Empty) // how do I access the Id property? 
       dbSet.Add(entityToSave); 
      else 
       db.Entry(entityToSave).State = EntityState.Modified; 
     } 
    } 
3

Id 속성을 포함하는 인터페이스를 만들어야합니다.

모든 엔티티 클래스가이 인터페이스를 구현하고 T을 구현하도록 제한하십시오. (where T : IHasId)
그러면 메서드에서이 인터페이스의 모든 멤버에 액세스 할 수 있습니다.

1

다른 사람들과 마찬가지로 인터페이스를 사용하여 문제를 해결할 수 있습니다. 또 다른 가능성은, 인터페이스를 통해

SaveObject(entityToSave, dbSet, e => e.Id) 
SaveObject(otherEntityToSave, dbSet, e => e.UserID) 

으로 접근 위양 장점을

private void SaveObject<T>(T entityToSave, DbSet<T> dbSet, Func<T,Guid> accessId) 
{ 
    ... 
    Guid id = accessId(entityToSave); 
    ... 
} 

전화를 정의하는 것입니다 IDS는 함께 두 번째 제네릭 매개 변수, 심지어 다른 종류의 서로 다른 이름을 가질 수 있다는 것입니다

private void SaveObject<T,I>(T entityToSave, DbSet<T> dbSet, Func<T,I> accessId) 
{ 
    ... 
    I id = accessId(entityToSave); 
    ... 
} 
관련 문제