2012-08-08 104 views
2

合并这是我AbstractNHibernateDao,我想使用SaveOrUpdateCopy与合并命令,但是当我试图用型TI使用有以下错误与泛型类型NHibernate的

错误1型“T “必须是为了用它作为 参数的引用类型‘’在通用类型或方法 ‘NHibernate.ISession.Merge(T)’

public abstract class AbstractNHibernateDao<T, TIdT> : IDao<T, TIdT> 
    { 
     private readonly Type _persitentType = typeof (T); 

     /// <summary> 
     /// Exposes the ISession used within the DAO. 
     /// </summary> 
     private static ISession NHibernateSession 
     { 
      get { return NHibernateSessionManager.Instance.GetSession(); } 
     } 

     #region IDao<T,TIdT> Members 



     /// <summary> 
     /// For entities that have assigned ID's, you must explicitly call Save to add a new one. See http://www.hibernate.org/hib_docs/reference/en/html/mapping.html#mapping-declaration-id-assigned. 
     /// </summary> 
     public T Save(T entity) 
     { 
      NHibernateSession.Save(entity); 
      NHibernateSession.Flush(); 
      return entity; 
     } 

     /// <summary> 
     /// For entities with automatatically generated IDs, such as identity, SaveOrUpdate may be called when saving a new entity. SaveOrUpdate can also be called to update any entity, even if its ID is assigned. 
     /// </summary> 
     public T SaveOrUpdate(T entity) 
     { 
      NHibernateSession.SaveOrUpdate(entity); 
      NHibernateSession.Flush(); 
      return entity; 
     } 

     public T SaveOrUpdateCopy(T entity) 
     { 
      NHibernateSession.Merge(entity); 
      return entity; 
     } 

     public void Delete(T entity) 
     { 
      NHibernateSession.Delete(entity); 
      NHibernateSession.Flush(); 
     } 

     /// <summary> 
     /// Commits changes regardless of whether there's an open transaction or not 
     /// </summary> 
     public void CommitChanges() 
     { 
      if (NHibernateSessionManager.Instance.HasOpenTransaction()) 
      { 
       NHibernateSessionManager.Instance.CommitTransaction(); 
      } 
      else 
      { 
       // If there's no transaction, just flush the changes 
       NHibernateSessionManager.Instance.GetSession().Flush(); 
      } 
     } 

    } 

我怎样才能使用它T'

+0

@Miroslav后期编辑 – 2012-08-08 09:48:30

回答

3

你应该做的,而不是Merge(entity)Merge(T)

public abstract class AbstractNHibernateDao<T, TIdT> 
    : IDao<T, TIdT> where T : class 
{ 
    public T SaveOrUpdateCopy(T entity) 
    { 
     NHibernateSession.Merge(entity); 
     return entity; 
    } 
} 
+1

如果我这样做,我有以下错误错误类型“T”必须是引用类型才能使用它作为泛型类型或方法中的参数'T''NHibernate.ISession.Merge (T)' – 2012-08-08 09:46:58

+2

@Luigi只需添加通用约束到类'where T:class' – 2012-08-08 10:11:35

+0

Ok正常工作:-D – 2012-08-08 10:39:43