开发者

Generic repository select by ID in EF4

开发者 https://www.devze.com 2023-01-11 02:37 出处:网络
So I\'m trying to create a generic select by ID method for a base repository class. In order to achieve this I\'m using EF4 with POCO\'s. I created an interface with a getter called Id and successfull

So I'm trying to create a generic select by ID method for a base repository class. In order to achieve this I'm using EF4 with POCO's. I created an interface with a getter called Id and successfully modified the T4 template in order to have a generi开发者_JAVA百科c Id property in all the entities that returns the PK.

The problem comes when I use the query. I'm implementing it like this:

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

And even though all the entities returned by the ObjectSet have the Id property set with their current primary key value, I'm getting a weird error:

The specified type member 'Id' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

Am I missing something?


If the generic Id only (as you mention) "returns the PK" but is not actually mapped to the PK itself, then there is no way for EF to convert this to a SQL query.

One pattern I've used in the past: if all of your entities will have an int PK called Id then you can have all of them inherit from some baseclass where that Id property is defined (and mapped to) and then add a where clause to your generic method:

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

FYI, I've also used this with entities with different types of PKs using generics.


I don't know. I think that

public virtual T GetByID(int id)

it's a bad idea because it's a hardcode. What if i got one entity with the guid key ?

Mine repository for STE entities

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

精彩评论

暂无评论...
验证码 换一张
取 消