Могу ли я написать общий репозиторий с первым сценарием db, чтобы динамически получить мне сущность по id? - PullRequest
0 голосов
/ 14 декабря 2011

Я хотел бы знать, как создать метод, который позволит мне сделать это в общем ...

public class Repo<T> : IGenericRepo<T> where T : class
    {
        protected PteDotNetEntities db;

        public T Get(int id)
        {
            //how do I dynamically get to the correct entity object and select it by
            //id?
        }

    }

1 Ответ

0 голосов
/ 14 декабря 2011

Да, вы можете. Если вы знаете, что все ваши сущности будут иметь свойство простого первичного ключа типа int и имени Id, вы можете сделать это просто:

public interface IEntity
{
    int Id { get; }
}

Все ваши объекты должны реализовать этот интерфейс. Далее вы можете просто сделать:

public class Repo<T> : IGenericRepo<T> where T : class, IEntity
{
    protected PteDotNetEntities db;

    public T Get(int id)
    {
        return db.CreateObjectSet<T>().FirstOrDefault(e => e.Id == id);
    }
}

Это самое простое из возможных решений. Есть лучшие решения, использующие GetObjectByKey, но они более сложные. Разница между FirstOrDefault и GetObjectByKey заключается в повторяемости исполнения. FirstOrDefault всегда выполняет запрос к БД, тогда как GetObjectByKey сначала проверяет, был ли объект с тем же ключом уже загружен / присоединен к контексту, и возвращает его, не запрашивая базу данных. В качестве ссылки для версии, используя GetObjectByKey, вы можете проверить похожие вопросы:

Вы можете упростить эти примеры, если заранее знаете имя ключевого свойства (принудительно вызывается интерфейсом).

В случае использования кода сначала / DbContext API вы также можете проверить этот вопрос:

...