Как реализовать общий метод GetById с использованием Entity Framework 4 и шаблона репозитория? - PullRequest
6 голосов
/ 03 апреля 2011

У меня есть общий репозиторий и я хотел бы реализовать универсальный метод GetById.Пока это мой интерфейс хранилища:

public interface IRepository<T> where T : EntityObject  
{
    void Add(T entity);
    void Delete(int id);
    void Delete(T entity);
    IEnumerable<T> Find(Expression<Func<T, bool>> predicate);
    T SingleOrDefault(Expression<Func<T, bool>> predicate);
    IEnumerable<T> GetAll();
    T GetById(int id);
    void Save();
    T Single(Expression<Func<T, bool>> predicate);
}

Я использую Entity Framework 4.1.Многие решения, которые я нашел, использовали абстрактный базовый класс интерфейса для класса IEntity, от которого сущности должны наследовать для выполнения поиска Id.

Вместо того, чтобы реализовывать интерфейс для всех моих классовЯ пытался использовать этот бит кода:

T entity = _objectSet.Where(
    x => x.EntityKey.EntityKeyValues
          .Select(v => v.Value.Equals(id)).Count() == 1).First();

Однако при попытке использовать метод я получаю исключение:

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

Может кто-нибудь сказать мнекак я могу заставить это работать?

Обновление 1

Члены _objectContext и _context объявлены так:

private readonly ObjectContext _context;
private readonly IObjectSet<T> _objectSet;

Спасибо.

Ответы [ 2 ]

5 голосов
/ 03 апреля 2011

Из этого вопроса Как получить имя ключа сущности ObjectSet ? , вы можете немного обмануть и использовать ESQL.

    public T GetById(int id)
    {

        var keyPropertyName = _objectSet.EntitySet.ElementType.KeyMembers[0].ToString();        

        T entity = _objectSet.Where("it." + keyPropertyName + "=" + id).First();
        return entity;

    }

Я включил в метод весь необходимый код, очевидно, вы хотите немного изменить его, но он должен работать для вас.

0 голосов
/ 19 февраля 2014

Для тех, кому «повезло» работать в VB.net, и вы изо всех сил пытаетесь получить рабочий пример:

Imports System.Runtime.CompilerServices
Imports System.Data.Objects
Imports System.Collections.Generic

Public Module ObjectSetExtension

    <Extension()>
    Public Function GetById(Of T As Class)(self As ObjectSet(Of T), Id As Integer)
        Dim keyPropertyName = self.EntitySet.ElementType.KeyMembers(0).ToString()
        Dim entity As T = self.Where("it." & keyPropertyName & "=" & Id).First
        Return entity
    End Function

    <Extension()>
    Public Function GetById(Of T As Class)(self As ObjectSet(Of T), Id As Guid)
        Dim keyPropertyName = self.EntitySet.ElementType.KeyMembers(0).ToString()
        ' 'note the "GUID" in the string. DO NOT REMOVE!
        Dim entity As T = self.Where("it." & keyPropertyName & "=GUID '" & Id.ToString() & "'").First
        Return entity
    End Function

End Module
...