public class Repository<TEntity> : IRepository<TEntity> where TEntity : Entity
{
private IDbSet<TEntity> GetSet()
{
return _unitOfWork.CreateSet<TEntity>();
}
}
在上面的代码中,我在 GetSet(( 上收到以下错误
错误 1 类型"TEntity"必须是引用类型,才能在泛型类型或方法"System.Data.Entity.IDbSet"中将其用作参数"TEntity" E:\Pradeep\Workshop\WebAPI\Extras\DDD\DDD.WebAPI\4.DDD.Infrastructure\Repository\Repository.cs 44 33 4.DDD.Infrastructure
在Repository
类上,您对类型参数TEntity
有一个泛型约束:
where TEntity : Entity
在实体框架中,实体必须是类(由where T : class
约束强制实施(。由于您收到错误,因此Entity
不是一个类。唯一的可能性是它是一个struct
或一个接口。根据这一点,您的问题的解决方案完全不同:
- 如果
Entity
是struct
,则需要将其更改为class
。EF 不允许你创建具有值类型的实体集。 - 如果
Entity
是一个接口,则需要将引用类型约束转发到存储库类(也许在使用它时将接口重命名为IEntity
以符合 .NET 编码准则(。
如果Entity
是一个接口,下面是代码:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class, Entity
{
//...
}
如果将class
添加到 where
语句中,则编译器将知道它只能是引用类型。喜欢这个:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : Entity, class
{
// ...
}