我已经建立了一个通用存储库接口,挂起了许多特定于实体的存储库接口。镜像此结构是一些具体的存储库类。
我在我的基础存储库类中遇到以下错误:
键入' 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; }
}
}
答案 0 :(得分:0)
看起来您的TEntity
类没有实现该接口:IEntity<TIdentity>
如果您在CodeFirst
或EntityFramework
使用ModelFirst
,则可以选择其他选项:
ModelFirst
:您可以使用Model.tt
文件来指定所需接口的实现。
CodeFirst
:只需在模型类中实现该接口。
第三种选择只是在你当时没有使用该界面的任何东西时摆脱where TEntity : IEntity<TIdentity>
。