所以我正在尝试为基础存储库类创建一个通用的ID方法选择。为了达到这个目的,我使用EF4和POCO。我创建了一个名为Id的getter接口,并成功修改了T4模板,以便在返回PK的所有实体中都有一个通用的Id属性。
当我使用查询时出现问题。我正在实现它:
public virtual T GetByID(int id)
{
return Database.ObjectSet<T>().SingleOrDefault(entity => entity.Id == id);
}
即使ObjectSet返回的所有实体都将Id属性设置为当前的主键值,我也会遇到一个奇怪的错误:
指定的类型成员'Id'不是 LINQ to Entities支持。只要 初始化者,实体成员和 实体导航属性是 支撑。
我错过了什么吗?
答案 0 :(得分:3)
如果只有通用Id(如你所说)“返回PK”但实际上并没有映射到PK本身,那么EF就无法将其转换为SQL查询。
我过去使用的一种模式:如果你的所有实体都有一个名为Id的int PK,那么你可以让它们全部继承自某个基类,其中Id属性被定义(并映射到),然后添加通用方法的where子句:
public virtual T GetByID(int id) where T : EntityBaseClass
仅供参考,我也使用泛型,使用不同类型PK的实体。
答案 1 :(得分:1)
我不知道。我想那个
public virtual T GetByID(int id)
这是一个坏主意,因为它是硬编码。 如果我有一个带有guid键的实体怎么办?
STE实体的挖掘库
public interface IRepository<TE, TK>
where TE : class, IEntityId<TK>, new()
where TK : struct
{
IQueryable<TE> Query();
IQueryable<TE> Query(Expression<Func<TE, Object>> includeExpression);
IQueryable<TE> Query(IEnumerable<Expression<Func<TE, Object>>> includeExpressions);
TE GetById(Expression<Func<TE, Boolean>> predicate);
void Create(TE entity);
void Update(TE entity);
void Delete(TE entity);
}
public interface IEntityId<out TK> where TK : struct
{
TK Id { get; }
Int32 OwnerCode { get; }
}