2016-12-19 6 views
0

Я построил общий интерфейс репозитория, от которого зависает ряд интерфейсов репозитория, специфичных для сущности. Зеркалирование этой структуры - это ряд конкретных классов репозитория.Тип 'TEntity' не соответствует ожидаемому типу '???'

Я получаю следующее сообщение об ошибке в моем базовом классе Repository:

Error location

Тип 'TEntity' не соответствует ожидаемого типа '???'.
Метод 'GetAll' не может реализовать метод из интерфейса '... IRepository < TEntity, TIdentity >'. Тип возврата должен быть «System.Collections.Generic.List <???> '.

Минимизированный интерфейс/структура классов выглядит следующим образом:

IRepository:

public interface IRepository<TEntity, in TIdentity> where TEntity : IEntity<TIdentity> 
{ 
    ... 
    List<TEntity> GetAll(); 
    ... 
} 

Repository:

internal class Repository<TEntity, TIdentity> : IRepository<TEntity, TIdentity> 
     where TEntity : class, IEntity<TIdentity> 
{ 
    ... 
    protected DbSet<TEntity> Set => _set ?? (_set = _context.Set<TEntity>()); 

    public List<TEntity> GetAll() 
    { 
     return Set.ToList(); 
    } 
    ... 
} 

IRoleRepository:

public interface IRoleRepository : IRepository<Role, Guid> 
{ 
    ... 
    Role FindByName(string roleName); 
    ... 
} 

RoleRepository:

internal class RoleRepository : Repository<Role, Guid>, IRoleRepository 
{ 
    ... 
    public Role FindByName(string roleName) 
    { 
     return Set.FirstOrDefault(x => x.Name == roleName); 
    } 
    ... 
} 

Это стук эффект в моих классах потребляющих где проделывают RoleRepository.GetAll() Возвращает List<???>, а не List<Role>, как я ожидал.

Edit - Entity определения ...

IEntity:

public interface IEntity<T> 
{ 
    T Id { get; set; } 
    byte[] Version { get; set; } 
} 

Entity:

public abstract class Entity<T> : IEntity<T> 
{ 
    public T Id { get; set; } 
    public byte[] Version { get; set; } 
} 

Роль:

public class Role : Entity<Guid> 
{ 
    private ICollection<User> _users; 
    public string Name { get; set; } 
    public ICollection<User> Users 
    { 
     get { return _users ?? (_users = new List<User>()); } 
     set { _users = value; } 
    } 
} 
+0

Я думаю, что это должно быть 'Set.ToList ();' – vendettamit

+0

Спасибо, попробовал это, но он не разрешил ошибку. Также ReSharper говорит мне, что спецификация аргументов типа избыточна. –

+1

Является ли ваш TEntity реализующим все интерфейсы, из которых вызывается инструкция? Я думаю, что TEntity не реализует IEntity , поскольку TEntity - тип EF. Попробуйте удалить из этого репозитория. – MadOX

ответ

0

Похоже, ваш TEntity класс не реализует этот интерфейс: IEntity<TIdentity>

Зависит от того, если ваш используете CodeFirst на EntityFramework или ModelFirst у вас есть другие варианты, чтобы пойти с:

ModelFirst: вы можете используйте файл Model.tt, чтобы указать реализацию необходимых вам интерфейсов.

CodeFirst: просто реализуйте этот интерфейс в классе модели.

Третий вариант - просто избавиться от этого where TEntity : IEntity<TIdentity>, только если вы ничего не используете из этого интерфейса.

+0

Я добавил определения модели сущности к вопросу. 'Роль' наследует от' Entity <> ', который реализует' IEntity <> '. EF не входит в это на этом этапе, поскольку я имею дело исключительно с сущностями, и мне нравится сохранять настойчивость полностью отдельной. –