通用存储库按EF4中的ID选择

所以我正在尝试为基础存储库类创建一个通用的ID方法select。 为了达到这个目的,我使用EF4和POCO。 我创建了一个名为Id的getter接口,并成功修改了T4模板,以便在返回PK的所有实体中都有一个通用的Id属性。

我使用查询时出现问题。 我正在实现它:

public virtual T GetByID(int id) { return Database.ObjectSet().SingleOrDefault(entity => entity.Id == id); } 

即使ObjectSet返回的所有实体都将Id属性设置为当前的主键值,我也会遇到一个奇怪的错误:

LINQ to Entities不支持指定的类型成员“Id”。 仅支持初始化程序,实体成员和实体导航属性。

我错过了什么吗?

如果仅通用Id(如您所述)“返回PK”但实际上并未映射到PK本身,那么EF无法将其转换为SQL查询。

我过去使用的一种模式:如果你的所有实体都有一个名为Id的int PK,那么你可以让它们都从某个基类inheritance,其中Id属性被定义(并映射到),然后添加一个where子句你的通用方法:

 public virtual T GetByID(int id) where T : EntityBaseClass 

仅供参考,我也使用generics,将它与不同类型PK的实体一起使用。

我不知道。 我觉得

 public virtual T GetByID(int id) 

这是一个坏主意,因为它是硬编码。 如果我有一个带有guid键的实体怎么办?

STE实体的矿山存储库

  public interface IRepository where TE : class, IEntityId, new() where TK : struct { IQueryable Query(); IQueryable Query(Expression> includeExpression); IQueryable Query(IEnumerable>> includeExpressions); TE GetById(Expression> predicate); void Create(TE entity); void Update(TE entity); void Delete(TE entity); } public interface IEntityId where TK : struct { TK Id { get; } Int32 OwnerCode { get; } }