2017-02-08 13 views
0
public class Repository<TEntity> : IRepository<TEntity> where TEntity : Entity 
{ 
    private IDbSet<TEntity> GetSet() 
    { 
     return _unitOfWork.CreateSet<TEntity>(); 
    } 
} 

В приведенном выше коде я получаю следующее сообщение об ошибке на GetSet()Ошибка - тип «TEntity» должен быть ссылочного типа для того, чтобы использовать его в качестве параметра

Ошибка 1 тип ' TEntity 'должен быть ссылочным типом, чтобы использовать его как параметр «TEntity» в родовом типе или методе «System.Data.Entity.IDbSet» E: \ Pradeep \ Workshop \ WebAPI \ Extras \ DDD \ DDD.WebAPI \ 4 .DDD.Infrastructure \ Repository \ Repository.cs 44 33 4.DDD.Infrastructure

+3

Что такое 'Entity'? Является ли это 'struct 'или интерфейсом? – Sefe

ответ

0

Если вы добавите class в инструкцию where, тогда компилятор будет знать, что это может быть только ссылочный тип. Как это:

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

Если 'Entity' является' struct', это вызовет ошибку компилятора. – Sefe

+1

@Sefe тогда OP будет на 10 шагов ближе к выяснению проблемы :) –

+1

@CallumLinington: Да, но, вероятно, не для просветления. Если 'Entity' - это структура, то создание универсального класса имеет нулевой смысл, потому что единственным допустимым параметром типа будет' Entity' (для 'structs' нет наследования). – Sefe

1

На вашем Repository классе у вас есть общие ограничения на параметре типа TEntity:

where TEntity : Entity 

В рамках сущности, организации должны быть классы (насильственные на where T : class ограничении). Поскольку вы получаете ошибку, Entity не является классом. Единственные возможности заключаются в том, что это struct или интерфейс. В зависимости от того, решения вашей проблемы совершенно различны:

  1. Если Entity является struct, вы должны изменить его на class. EF не позволит вам создать набор объектов с типами значений.
  2. Если Entity - это интерфейс, вам необходимо перенаправить ограничение ссылочного типа в ваш класс репозитория (и, возможно, пока вы на нем переименуете свой интерфейс на IEntity, чтобы соответствовать правилам кодирования .NET).

Вот код, если Entity является интерфейсом:

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

 Смежные вопросы

  • Нет связанных вопросов^_^