Вот простой фрагмент:
public interface IRepository<T>
{
T Get(int id);
}
public class Repository<T> : IRepository<T> where T : class
{
private readonly IRepositoryContext _repositoryContext;
private IObjectSet<T> _objectSet;
public Repository(IRepositoryContext repositoryContext)
{
_repositoryContext = repositoryContext;
_objectSet = repositoryContext.GetObjectSet<T>();
}
public virtual T Get(int id)
{
return ObjectSet.First(x=> x.Id == id)
// that wouldn't work because there is no guarantee that T entity has Id property
}
Теперь, как вы можете видеть, я могу создать экземпляр Repository для любого объекта сущности и использовать определенные методы (хотя в примере у нас есть только Get (). Но я не могу использовать какие-либо ограничения в выражениях, если не создаю неабстрактный классы для каждой сущности T
основаны на IRepository<T>
, а затем реализуют методы так, как я хочу.
Но что, если мне нужно использовать метод, подобный Get
, реализация которого остается неизменной, вероятно, для всех сущностей (у каждой сущности есть Id).
Как это сделать?
Я подумал, что мог бы создать абстрактную сущность в конструкторе модели данных EF, сопоставленную с ничем, и пометить ее как базовый тип для всех других сущностей, но он запрашивает отображение, т. Е. Таблицу. Вместо этого я попытался использовать сложный тип - это не позволило бы мне наследовать его.
Итак, покажите мне, пожалуйста, самый эффективный способ добиться этого