通用存储库EF4 CTP5 getById

Dav*_*veo 1 generics entity-framework repository-pattern entity-framework-ctp5

我有一个通用的存储库,我试图添加一个GetById方法,如下所示 C#LINQ to SQL:重构这个通用的GetByID方法

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

所以我在尝试使用时遇到错误

Mapping.GetMetaType
Run Code Online (Sandbox Code Playgroud)

return _set.Where( whereExpression).Single();
Run Code Online (Sandbox Code Playgroud)

如何在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>();

        }
Run Code Online (Sandbox Code Playgroud)

Lad*_*nka 10

最基本的方法很简单

public T GetById(params object[] keys)
{
  _set.Find(keys);
}
Run Code Online (Sandbox Code Playgroud)

如果您知道所有实体都具有名为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);
  }
}
Run Code Online (Sandbox Code Playgroud)

如果数据类型并不总是相同,您可以使用:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

你也可以简单地使用:

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

  public TEntity GetById(TKey id)
  {
    _set.Find(id);
  }
}
Run Code Online (Sandbox Code Playgroud)