我有一个通用存储库,并希望实现一个通用 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);
}
我正在使用 Entity Framework 4.1。我发现的许多解决方案都是为 IEntity 类使用接口(interface)的抽象基类,实体必须从该类继承才能执行 Id 查找。
我不必为我的所有类实现一个接口(interface),而是尝试使用这段代码:
T entity = _objectSet.Where(
x => x.EntityKey.EntityKeyValues
.Select(v => v.Value.Equals(id)).Count() == 1).First();
但是,当尝试使用该方法时,我收到异常:
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;
谢谢。
最佳答案
从这个问题 How to get ObjectSet<T>'s entity key name? ,您可以稍微作弊并使用 ESQL。
public T GetById(int id)
{
var keyPropertyName = _objectSet.EntitySet.ElementType.KeyMembers[0].ToString();
T entity = _objectSet.Where("it." + keyPropertyName + "=" + id).First();
return entity;
}
我已经在方法中包含了所有需要的代码,显然你想稍微重构一下,但它应该适合你。
关于entity-framework - 如何使用 Entity Framework 4 和存储库模式实现通用 GetById 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5527311/