2012-01-12 69 views
0

在我的基地回購我有這樣的代碼工作正常:爲什麼我不能在NHibernate中使用CreateCriteria的泛型?

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'的定義是什麼樣的? – 2012-01-12 17:54:18

+0

'實體'是通用的,可以是我的域中的任何對象。我有'Account','Broker'等 – 2012-01-12 18:08:45

回答

4

CreateCriteria方法要求使用引用類型 - 增加約束你的DAL方法:

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

這自然是我mplies,你傳遞給這個方法的任何Entity類型必須是一個引用類型。

我也建議命名您的泛型類型參數TEntity - Entity單獨是有點混亂(因爲它是完美的名稱,說實體基類)。

+0

謝謝,構建確定,但是當我在單元測試中練習它時,出現此錯誤:'M:Test.RepoTest.CanGetAllAccounts failed:Object reference not set to an instance of一個東西。 System.NullReferenceException:未將對象引用設置爲對象的實例。「 – 2012-01-12 18:07:42

+0

」_session「是否設置爲實際實例? CanGetAllAcounts'測試方法的外觀如何?你使用任何測試設置方法?對於NRE可能有多種原因,沒有更多的代碼就很難說清楚。 – 2012-01-12 18:13:32

+0

哦,不,我覺得很愚蠢。我忘了將我的[Test]屬性放在我的測試中。一旦我完成了它的工作。衛生署! – 2012-01-12 18:23:50

相關問題