通用存储库按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; } }