Да, вы можете. Если вы знаете, что все ваши сущности будут иметь свойство простого первичного ключа типа 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 вы также можете проверить этот вопрос: