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