Une classe Tache à une méthode InsertToDb qui à pour but d’insérer l'objet et ses fils des Actions dans une base de données.
private void InsertToDb(IDbConnection cnx)
{
this.Id = Convert.ToInt32(cnx.Insert<Tache>(this, selectIdentity: true));
// insertion des actions
foreach (Action act in this.Actions)
{
act.TacheId = this.Id;
act.ToDB(cnx);
}
}
Pour rendre le code transactionnel il faut lancer une transaction : le réflexe est la méthode BeginTransaction() de la classe IDbConnection.
Et bien avec ServiceStack ça marche pas avec le select identity, il semble que la transaction soit mal initialisée. Pour y arriver facilement il faut utiliser la méthodes d'extension : OpenTransaction() Qui fait la même chose sans générer d'erreur !
using (FConnexion cnn = new FConnexion())
{
var tran = cnn.Db.OpenTransaction();
try
{
// mettre en base la tâche
t.ToDB(cnn.Db);
tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
throw ex;
}
}
Ne pas oublier le using qui va bien :
using ServiceStack.OrmLite;
La classe FConnection gère une propriété IDbConnection Db et se charge d'ouvrir la connexion à la base.
using System;
using System.Data;
using ServiceStack.OrmLite;
using ServiceStack.OrmLite.SqlServer;
/// Class base pour gestion connexion.
/// </summary>
public class FConnexion : IDisposable
{
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="FConnexion" />.
/// </summary>
public FConnexion()
{
var dbfactory = new OrmLiteConnectionFactory(System.Configuration.ConfigurationManager.ConnectionStrings["MaBase"].ToString(), SqlServerOrmLiteDialectProvider.Instance);
this.Db = dbfactory.Open();
this.Db.Open();
}
/// <summary>
/// Obtient ou définit La connexion
/// </summary>
public IDbConnection Db { get; private set; }
/// <summary>
/// Libère les ressources de l'objet de connexion.
/// </summary>
public void Dispose()
{
this.Db.Dispose();
}
}
Enjoy !