【问题标题】:Error - The type 'TEntity' must be a reference type in order to use it as parameter [closed]错误 - 类型“TEntity”必须是引用类型才能将其用作参数[关闭]
【发布时间】:2017-02-08 09:48:47
【问题描述】:
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

【问题讨论】:

  • 什么是Entity?是struct 还是接口?

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


【解决方案1】:

在您的 Repository 类上,您对类型参数 TEntity 有一个通用约束:

where TEntity : Entity

在实体框架中,实体必须是类(由where T : class 约束强制执行)。由于您收到错误,Entity 不是一个类。唯一的可能性是它是struct 或接口。根据这一点,您的问题的解决方案完全不同:

  1. 如果Entitystruct,则需要将其更改为class。 EF 不允许您创建具有值类型的实体集。
  2. 如果Entity 是一个接口,您需要将引用类型约束转发到您的存储库类(并且可能在您使用它时将您的接口重命名为IEntity 以符合.NET 编码准则)。李>

如果Entity 是一个接口,代码如下:

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class, Entity
{
    //...
}

【讨论】:

  • 谢谢!谢谢!谢谢!!在花了 2 小时想知道出了什么问题并且几乎要发疯之后,你一针见血,我的模型类是一个结构。将其更改为一个类修复了它。
【解决方案2】:

如果将class 添加到where 语句中,那么编译器将知道它只能是引用类型。像这样:

public class Repository<TEntity> : IRepository<TEntity> where TEntity : Entity, class
{
    // ...
}

【讨论】:

  • 如果Entitystruct 这将导致编译器错误。
  • @Sefe 那么 OP 将离解决问题更近 10 步 :)
  • @CallumLinington:是的,但可能不是为了启蒙。如果Entity 是一个结构,则使类泛型为零意义,因为唯一有效的类型参数是Entitystructs 没有继承)。
  • @Sefe 我更喜欢将此作为解决方案的一部分,因为它可以正确利用编译器来及早捕获错误
  • 顺便说一句,即使Entity 是一个接口,编译器也会拒绝该解决方案。 class 约束必须位于任何接口约束之前。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多