Почему я не могу использовать дженерики с CreateCriteria в NHibernate? - PullRequest
0 голосов
/ 12 января 2012

В моем Базовом репо у меня есть этот код, который отлично работает:

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 для справки: Стоит ли использовать дженерики для упрощения моего DAL?

1 Ответ

4 голосов
/ 12 января 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...