使用Merge而不是SaveOrUpdate

时间:2017-07-20 13:47:25

标签: c# nhibernate

我有以下代码。它有时会给出运行时错误:

  

已经有一个具有相同标识符值的不同对象   与会话相关联

我看到了一个建议使用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;
    }
    ...

}

1 个答案:

答案 0 :(得分:2)

添加两个约束:

where T : class, new()