универсальный репозиторий EF4 CTP5 getById - PullRequest
1 голос
/ 02 марта 2011

У меня есть общий репозиторий, и я пытаюсь добавить метод GetById, как показано здесь C # LINQ to SQL: Рефакторинг этого общего метода GetByID

Проблема в том, что мой репозиторий не используетВместо этого я использую System.Data.Linq.DataContext. Я использую System.Data.Entity.DbContext

. Поэтому я получаю ошибки, когда пытаюсь использовать

Mapping.GetMetaType

и

return _set.Where( whereExpression).Single();

Как я могу реализовать универсальный метод GetById в CTP5?Должен ли я использовать System.Data.Entity.DbContext в моем репозитории.

Вот начало моего класса репозитория

  public class BaseRepository<T> where T : class
    {

        private DbContext _context;
        private readonly DbSet<T> _set;

        public BaseRepository()
        {
            _context = new MyDBContext();
            _set = _context.Set<T>();

        }

Ответы [ 2 ]

10 голосов
/ 02 марта 2011

Самый простой подход - это просто

public T GetById(params object[] keys)
{
  _set.Find(keys);
}

Если вы знаете, что все ваши сущности имеют первичный ключ с именем Id (его не нужно называть Id в БД, но он должен быть сопоставлен со свойством Id) определенного типа, вы можете использовать это просто:

public interface IEntity
{
  int Id { get; }
}

public class BaseRepository<T> where T : class, IEntity
{
  ...

  public T GetById(int id)
  {
    _set.Find(id);
  }
}

Если тип данных не всегда один и тот же, вы можете использовать:

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

public class BaseRepository<TEntity, TKey> where TEntity : class, IEntity<TKey>
{
  ...

  public TEntity GetById(TKey id)
  {
    _set.Find(id);
  }
}

Вы также можете просто использовать:

public class BaseRepository<TEntity, TKey> where TEntity : class
{
  ...

  public TEntity GetById(TKey id)
  {
    _set.Find(id);
  }
}
1 голос
/ 22 декабря 2011

попробуйте

    public virtual T GetByID(object id)
    {

        // Define the entity key values.
        IEnumerable<KeyValuePair<string, object>> entityKeyValues =
            new KeyValuePair<string, object>[] { 
            new KeyValuePair<string, object>("Id", id) };

        string qualifiedEntitySetName = _context.DefaultContainerName + "." + typeof(T).Name;
        EntityKey key = new EntityKey(qualifiedEntitySetName, entityKeyValues);

        return (T)_context.GetObjectByKey(key);           
    }
...