通用存储库EF4 CTP5 getById

时间:2011-03-02 10:41:48

标签: entity-framework generics repository-pattern entity-framework-ctp5

我有一个通用存储库,我试图添加一个GetById方法,如下所示 C# LINQ to SQL: Refactoring this Generic GetByID method

问题是我的存储库不使用System.Data.Linq.DataContext 相反,我使用System.Data.Entity.DbContext

所以我在尝试使用

时遇到错误
Mapping.GetMetaType

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

如何在CTP5中实现通用的GetById方法?我应该在我的存储库中使用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 个答案:

答案 0 :(得分:10)

最基本的方法就是

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

如果您知道所有实体都具有名为Id的主键(它不必在DB中称为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 :(得分:1)

试试这个

    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);           
    }