我有一个通用存储库,我试图添加一个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>();
}
答案 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);
}