Entity framework 通用存储库EF4 CTP5 getById

Entity framework 通用存储库EF4 CTP5 getById,entity-framework,generics,repository-pattern,entity-framework-ctp5,Entity Framework,Generics,Repository Pattern,Entity Framework Ctp5,我有一个通用存储库,我正在尝试添加一个GetById方法,如下所示 问题是我的存储库没有使用System.Data.Linq.DataContext 相反,我使用System.Data.Entity.DbContext 所以我在尝试使用时会出现错误 Mapping.GetMetaType 及 如何在CTP5中实现通用GetById方法?我应该在存储库中使用System.Data.Entity.DbContext吗 这是我的存储库类的开始 public class BaseReposito

我有一个通用存储库,我正在尝试添加一个GetById方法,如下所示

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

所以我在尝试使用时会出现错误

Mapping.GetMetaType

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

        }
公共类基本存储库,其中T:class
{
私有DbContext _context;
专用只读数据库集;
公共基本存储库()
{
_context=新的MyDBContext();
_set=_context.set();
}

最基本的方法是

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);
  }
}
公共接口的可扩展性
{
int Id{get;}
}
公共类BaseRepository,其中T:class,icity
{
...
公共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);
  }
}
公共接口的可扩展性
{
TKey Id{get;}
}
公共类BaseRepository,其中tenty:class,ienty
{
...
公共TEntity GetById(TKey id)
{
_set.Find(id);
}
}
您也可以简单地使用:

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

  public TEntity GetById(TKey id)
  {
    _set.Find(id);
  }
}
公共类基本存储库,其中tenty:class
{
...
公共TEntity GetById(TKey id)
{
_set.Find(id);
}
}
试试这个

    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);           
    }
公共虚拟T GetByID(对象id) { //定义实体键值。 IEnumerable entityKeyValues= 新的KeyValuePair[]{ 新的KeyValuePair(“Id”,Id)}; 字符串qualifiedEntitySetName=_context.DefaultContainerName+“+”typeof(T).Name; EntityKey=新的EntityKey(qualifiedEntitySetName,entityKeyValues); return(T)_context.GetObjectByKey(key); }
非常好,感谢您解释了许多方法。除了_set.FindBy之外,它们似乎都工作得很好。我在System.Data.Entity.DBSetIt上找不到这个方法:)它应该是
find
@Ladislav Mrnka:在第一个示例中,您提供了params对象[]GetById方法的键,如果有2个字段作为主键,如何将Find中的每个键映射到相关字段?@Noar:
Find
inDbContext API(EFv4.1)只需接受
params object[]
因此您只需按实体上定义的正确顺序发送参数。@Ladislav Mrnka:Find如何知道哪个对象是哪个键的?
    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);           
    }