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

时间:2010-08-07 20:52:35

标签: c# entity-framework entity-framework-4

所以我正在尝试为基础存储库类创建一个通用的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支持。只要   初始化者,实体成员和   实体导航属性是   支撑。

我错过了什么吗?

2 个答案:

答案 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; }
}
相关问题