общий репозиторий EF4 CTP5 getById

У меня есть общий репозиторий, и я пытаюсь добавить метод 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>();

        }

person Daveo    schedule 02.03.2011    source источник


Ответы (2)


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

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

Если вы знаете, что все ваши сущности имеют первичный ключ с именем 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);
  }
}
person Ladislav Mrnka    schedule 02.03.2011
comment
Отлично, спасибо за объяснение множества подходов. Кажется, все они работают нормально, кроме _set.FindBy Я не могу найти этот метод в System.Data.Entity.DBSet - person Daveo; 03.03.2011
comment
Опечатка :) Должно быть Find - person Ladislav Mrnka; 03.03.2011
comment
@Ladislav Mrnka: В вашем первом примере, где вы предоставляете ключи params object [] методу GetById, если в качестве первичных ключей используются 2 поля, как вы сопоставляете в Find каждый ключ соответствующее поле? - person Naor; 26.04.2011
comment
@Noar: Find в DbContext API (EFv4.1) просто принимайте params object[], поэтому вам нужно только отправлять параметры в правильном порядке, определенном в сущности. - person Ladislav Mrnka; 26.04.2011
comment
@ Ладислав Мрнка: Как Находка знает, какой объект для какого ключа? - person Naor; 26.04.2011
comment
@Naor: Find использует порядок параметров, потому что порядок ключевых членов должен быть определен. - person Ladislav Mrnka; 26.04.2011
comment
@ Ладислав Мрнка: Где этот порядок определен? Могу я его поменять? - person Naor; 26.04.2011
comment
@Naor: порядок определяется при сопоставлении с помощью свободного API, аннотаций данных или EDMX. - person Ladislav Mrnka; 26.04.2011
comment
@LadislavMrnka Привет, я пытаюсь (или изо всех сил пытаюсь) сделать что-то подобное с большим контролем над идентификатором, поэтому в последнем примере TEntity GetById мне было интересно, можем ли мы использовать x = ›x.Id.Equals (id) с учетом TEntity является универсальным типом Entity ‹TKey›, предоставляющим TKey Id {get; набор; }? поскольку я использую объектный контекст, а не dbcontext. - person Rushino; 12.01.2012

попробуй это

    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);           
    }
person mamun    schedule 22.12.2011