输入' TEntity'不符合预期的类型' ???'

时间:2016-12-19 17:24:55

标签: c# entity-framework generics repository-pattern

我已经建立了一个通用存储库接口,挂起了许多特定于实体的存储库接口。镜像此结构是一些具体的存储库类。

我在我的基础存储库类中遇到以下错误:

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();
    ...
}

存储库

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>

修改 - 实体定义......

IEntity

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

实体

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; }
    }
}

1 个答案:

答案 0 :(得分:0)

看起来您的TEntity类没有实现该接口:IEntity<TIdentity>

如果您在CodeFirstEntityFramework使用ModelFirst,则可以选择其他选项:

ModelFirst:您可以使用Model.tt文件来指定所需接口的实现。

CodeFirst:只需在模型类中实现该接口。

第三种选择只是在你当时没有使用该界面的任何东西时摆脱where TEntity : IEntity<TIdentity>