Generic repository select by ID in EF4

时光毁灭记忆、已成空白 提交于 2019-12-22 10:35:35

问题


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 generic 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?


回答1:


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.




回答2:


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


来源:https://stackoverflow.com/questions/3431995/generic-repository-select-by-id-in-ef4

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!