我有以下代码。它有时会给出运行时错误:
已经有一个具有相同标识符值的不同对象 与会话相关联
我看到了一个建议使用Merge
代替SaveOrUpdate
的解决方案。尝试时(参见注释掉的行)。我收到编译错误:
类型T必须是引用类型才能将其用作参数 泛型类型或方法中的
T
此错误的解决方案是将T : class
添加到类声明中。它已经有T : new()
。当我将其更改为“class”时,我会收到其他编译错误。
'T'必须是具有公共无参数构造函数的抽象类型 以便在泛型类型或方法
中将其用作参数'T'
并且还可以看到GetDefaultInstance()
我该怎么做?
public class GenericNHibernateDataService<T, ID> : Interface.Data.IGenericDataService<T, ID> where T : new()
public virtual T GetDefaultInstance()
{
return new T(); // compile error when changing to T : class
// Cannot create an instance of the variable type 'T' because it does not have the new constraint
}
public virtual T SaveOrUpdate (T entity)
{
NHibernate.ITransaction tx = null;
try
{
tx = this.Session.BeginTransaction();
this.Session.SaveOrUpdate (entity);
//Session.Merge(entity); //The type T must be a reference type in order to use it as a parameter `T` in the generic type or method
tx.Commit();
}
catch (System.Exception ex)
{
tx.Rollback();
throw ex;
}
return entity;
}
...
}
答案 0 :(得分:2)
添加两个约束:
where T : class, new()