2017-07-20 1 views
0

Ich habe den folgenden Code. Es gibt manchmal den Laufzeitfehler:Verwenden von Merge statt SaveOrUpdate

a different object with the same identifier value was already associated with the session

ich eine Lösung sah die Merge statt SaveOrUpdate schlägt mit. Wenn Sie das versuchen (siehe auskommentierte Zeile). Ich bekomme einen Compiler-Fehler:

The type T must be a reference type in order to use it as a parameter T in the generic type or method

Die Lösung dieser Fehler sagt T : class zu der Klassendeklaration hinzuzufügen. Es hat bereits T : new(). Wenn ich es in "Klasse" ändere, bekomme ich andere Kompilierungsfehler.

'T' must be an abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method

und auch GetDefaultInstance()

siehe Wie kann ich das tun?

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

Haben Sie versucht, beiden Einschränkungen hinzu: 'where T: Klasse, neu()'? –

+0

Das funktioniert! Post das als Antwort, wenn Sie möchten. –

+0

Fertig. Froh, dass es funktioniert hat. –

Antwort

2

beiden Einschränkungen hinzufügen:

where T : class, new() 
Verwandte Themen