代码之家  ›  专栏  ›  技术社区  ›  Raúl Roa

EF4中按ID选择通用存储库

  •  3
  • Raúl Roa  · 技术社区  · 14 年前

    因此,我尝试为一个基本存储库类创建一个通用的select by ID方法。为了实现这一点,我使用EF4与POCO的。我创建了一个名为Id的getter接口,并成功地修改了T4模板,以便在所有返回PK的实体中都有一个generic Id属性。

    当我使用查询时,问题来了。我是这样实现的:

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

    尽管ObjectSet返回的所有实体都使用当前主键值设置了Id属性,但我得到了一个奇怪的错误:

    指定的类型成员“Id”无效 在LINQ中支持到实体。仅限 初始值设定项、实体成员和 实体导航属性是 支持。

    我错过什么了吗?

    2 回复  |  直到 14 年前
        1
  •  3
  •   hackerhasid    14 年前

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

    我在过去使用过一种模式:如果所有实体都有一个名为Id的int PK,那么可以让所有实体从定义(并映射到)Id属性的某个基类继承,然后将where子句添加到泛型方法:

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

        2
  •  1
  •   Brian J. Hakim    14 年前

    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; }
    }