b3n*_*b3n 6 entity-framework repository-pattern entity-framework-4
我有一个通用的存储库,并希望实现一个通用的GetById方法.到目前为止,这是我的存储库界面:
public interface IRepository<T> where T : EntityObject
{
void Add(T entity);
void Delete(int id);
void Delete(T entity);
IEnumerable<T> Find(Expression<Func<T, bool>> predicate);
T SingleOrDefault(Expression<Func<T, bool>> predicate);
IEnumerable<T> GetAll();
T GetById(int id);
void Save();
T Single(Expression<Func<T, bool>> predicate);
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Entity Framework 4.1.我发现的很多解决方案都是为IEntity类使用一个抽象基类接口,实体必须继承这个类才能执行Id查找.
我没有为所有类实现接口,而是尝试使用这段代码:
T entity = _objectSet.Where(
x => x.EntityKey.EntityKeyValues
.Select(v => v.Value.Equals(id)).Count() == 1).First();
Run Code Online (Sandbox Code Playgroud)
但是,当尝试使用该方法时,我收到一个异常:
The specified type member 'EntityKey' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
有人能告诉我如何让这个工作吗?
更新1
成员_objectContext和_context声明如下:
private readonly ObjectContext _context;
private readonly IObjectSet<T> _objectSet;
Run Code Online (Sandbox Code Playgroud)
谢谢.
从这个问题如何获取ObjectSet <T>的实体密钥名称?,你可以作弊并使用ESQL.
public T GetById(int id)
{
var keyPropertyName = _objectSet.EntitySet.ElementType.KeyMembers[0].ToString();
T entity = _objectSet.Where("it." + keyPropertyName + "=" + id).First();
return entity;
}
Run Code Online (Sandbox Code Playgroud)
我已经在方法中包含了所有需要的代码,显然你想稍微重构它,但它应该适合你.
| 归档时间: |
|
| 查看次数: |
5236 次 |
| 最近记录: |