Выбор общего хранилища по идентификатору в EF4 - PullRequest
3 голосов
/ 08 августа 2010

Итак, я пытаюсь создать универсальный метод выбора по идентификатору для базового класса репозитория. Чтобы добиться этого, я использую EF4 с POCO. Я создал интерфейс с геттером Id и успешно изменил шаблон T4, чтобы иметь общее свойство Id во всех сущностях, которые возвращают PK.

Проблема возникает, когда я использую запрос. Я реализую это так:

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

И хотя для всех сущностей, возвращаемых ObjectSet, установлено свойство Id с их текущим значением первичного ключа, я получаю странную ошибку:

Указанный тип члена 'Id' не является поддерживается в LINQ to Entities. Только инициализаторы, члены сущности и свойства навигации объекта поддерживается.

Я что-то упустил?

Ответы [ 2 ]

3 голосов
/ 08 августа 2010

Если только общий Id (как вы упоминаете) «возвращает PK», но фактически не сопоставлен с самим PK, EF не сможет преобразовать это в SQL-запрос.

Один шаблон, который я использовал в прошлом: если все ваши сущности будут иметь int PK с именем Id, тогда вы можете получить все они наследуют от некоторого базового класса, где это свойство Id определено (и сопоставлено), а затем добавьте предложение where к вашему универсальному методу:

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

К вашему сведению, я также использовал это для сущностей с различными типами ПК, используя дженерики.

1 голос
/ 14 августа 2010

Я не знаю. Я думаю, что

public virtual T GetByID(int id)

это плохая идея, потому что это жесткий код. Что если я получу одну сущность с ключом guid?

Хранилище для шахтных организаций

    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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...