2012-01-12 2 views
0

В моих базах репо у меня есть этот код, который работает отлично:Почему я не могу использовать generics с CreateCriteria в NHibernate?

abstract class BaseRepo <T> : IRepo <T> 
{ 
    private ISession _session; 

    public Entity GetById<Entity>(int Id) 
    { 
     return _session.Get<Entity>(Id); 
    } 

    // other methods 
} 

Я хочу добавить еще один метод, чтобы вернуть все строки для объекта (объект). Я хочу сделать что-то вроде:

public IList<Entity> GetAll<Entity>() 
    { 
     return _session.CreateCriteria<Entity>().List<Entity>; 
    } 

, но я получаю сообщение об ошибке сказав:

The type 'Entity' must be a reference type in order to use it as parameter 'T' in the generic type or method 'NHibernate.ISession.CreateCriteria<T>()' 

Вот мой DAL дизайн для справки: Should I use generics to simplify my DAL?

+1

Как выглядит определение для 'Entity'? –

+0

'Entity' является общим и может быть любым объектом в моем домене. У меня есть 'Account',' Broker' и т. Д. –

ответ

4

CreateCriteria метод требует использования ссылочных типов - добавить ограничение на ваш метод DAL:

public IList<Entity> GetAll<Entity>() 
    where Entity : class 
{ 
    return _session.CreateCriteria<Entity>().List<Entity>(); 
} 

Это естественно, я mtsies, что любой тип Entity, который вы передаете этому методу, должен быть ссылочным типом.

Я также предлагаю называть ваш общий параметр типа TEntity - Entity только немного запутанный (так как это прекрасное имя для сказать, базовый класс сущности).

+0

Спасибо, что строит ОК, но когда я использую его в своем модульном тесте, я получаю эту ошибку: 'M: Test.RepoTest.CanGetAllAccounts не удалось: ссылка на объект не установлена ​​в экземпляр объект. System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта. ' –

+0

Действительно ли ваш' _session' установлен в фактический экземпляр? Как выглядит метод проверки «CanGetAllAcounts»? Используете ли вы какой-либо метод тестовой установки? Могут быть несколько причин для NRE, без лишнего кода, которые действительно сложно сказать. –

+0

О, я не чувствую себя таким глупым. Я забыл поместить свой тест [Test] в свой тест. Как только я это сделал, это сработало. Doh! –

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