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;
}
...
}
Haben Sie versucht, beiden Einschränkungen hinzu: 'where T: Klasse, neu()'? –
Das funktioniert! Post das als Antwort, wenn Sie möchten. –
Fertig. Froh, dass es funktioniert hat. –