Вы можете определить интерфейс, реализованный всеми вашими сущностями:
public interface IEntity
{
int Id { get; }
}
и способ получения вашей сущности:
public T GetObjectById<T>(int id) where T : class, IEntity
{
return context.CreateObjectSet<T>().SingleOrDefault(e => e.Id == id);
}
Вы также можете использовать подход, аналогичный предложенному в связанном вопросе . Вам просто нужно использовать другой метод, чтобы получить вашу сущность:
public virtual T GetByKey<T>(int id) where T : class, IEntity
{
string containerName = context.DefaultContainerName;
string setName = context.CreateObjectSet<T>().EntitySet.Name;
// Build entity key
var entityKey = new EntityKey(containerName + "." + setName, "Id", id);
return (TEntity)Context.GetObjectByKey(entityKey);
}
Разница в том, что первый метод всегда запрашивает базу данных, даже если вы уже загрузили экземпляр в контекст, тогда как второй подход сначала проверяет, загружен ли экземпляр. Метод не так эффективен, потому что он строит эти имена снова и снова. Здесь - более общий подход, который может работать с любым типом и именем ключа, а здесь - подход, работающий со сложными ключами.
Ни один из этих методов напрямую не работает с наследованием - вы должны предоставить базовый тип, чтобы он работал.