Entity framework 通用存储库EF4 CTP5 getById
我有一个通用存储库,我正在尝试添加一个GetById方法,如下所示 问题是我的存储库没有使用System.Data.Linq.DataContext 相反,我使用System.Data.Entity.DbContext 所以我在尝试使用时会出现错误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
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);
}