为什么我不能在NHibernate中使用泛型和CreateCriteria?

时间:2012-01-12 17:52:34

标签: c# nhibernate generics

在我的Base repo中,我有这个代码可以正常工作:

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 个答案:

答案 0 :(得分:4)

CreateCriteria方法要求您使用引用类型 - 在DAL方法上添加约束:

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

这自然意味着您传递给此方法的任何Entity类型都必须是引用类型。

我还建议命名你的泛型类型参数TEntity - Entity单独有点令人困惑(因为它是完美的名字,比如实体基类)。