Entity Framework 4 - Общий метод для извлечения сущности по идентификатору - PullRequest
1 голос
/ 27 марта 2011

Я пишу метод для извлечения отдельных объектов по их идентификатору:

public Customer GetCustomer(int i_CustomerID)
{
  return (from c in context.CustomerSet 
         where c.Id == i_CustomerID 
        select c).SingleOrDefault();            
}

public Movie GetMovie(int i_MovieID)
{
  return (from m in context.MovieSet 
         where m.Id == i_MovieID 
        select m).SingleOrDefault();
}

Но у меня много сущностей, и этот код повторяется. Я хочу написать такой метод:

public T GetEntityByID<T>(int i_EntityID)
{
  return (from e in context.T_Set 
         where e.Id == i_EntityID 
        select e).SingleOrDefault();
}

Есть ли способ достичь этого?

Ответы [ 3 ]

3 голосов
/ 27 марта 2011

Я на самом деле не выполнил это, но он компилируется и, вероятно, соответствует тому, что вы пытаетесь достичь:

    public static void Testing()
    {
        SelectEntity<MyObject>(r => r.MyObjectId == 1);
    }

    public static T SelectEntity<T>(Expression<Func<T, bool>> expression) where T : EntityObject
    {
        MyContext db = new MyContext();
        return db.CreateObjectSet<T>().SingleOrDefault(expression);
    }
1 голос
/ 27 марта 2011

Проблема в том, что не существует общего супертипа, обладающего соответствующими свойствами, которые вы ищете. Однако легко сгенерировать код для генерации ваших методов выборки, используя встроенный инструмент генерации кода T4, который использует EF. Вот хорошая ссылка на то, как подключиться и сгенерировать необходимый вам код.

http://msdn.microsoft.com/en-us/data/gg558520

0 голосов
/ 27 марта 2011

Если вы знаете, что ваш общий репозиторий всегда будет использоваться с типами сущностей, которые имеют PK с одинаковым именем и одинаковым типом, вы можете просто определить интерфейс следующим образом:

public interface IEntity
{
    int Id { get; }
}

и либо внедрите этот интерфейс в частичную часть созданных вами объектов, либо измените шаблон T4, чтобы включить его автоматически. Ваш репозиторий будет определен как:

public interface IRepository<TEntity> where T : IEntity
{
    ...
}

Если тип PK может измениться, но имя остается прежним, вы можете улучшить интерфейс объекта до:

public interface IEntity<TKey> 
{
    TKey Id { get; set; }
}

и определение хранилища будет:

public interface IRepository<TEntity, TKey> where TEntity : IEntity<TKey>
{
    ...
}

Если вам нужен общий репозиторий, который может работать с сущностями с разными именами и типами PK, проверьте этот ответ . Это решение, вероятно, должно также работать (или с небольшой модификацией) с композитными PK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...