Comment créer une LINQ to SQL Transaction?
J'ai un morceau de code qui fait appel à de multiples insertions, mais ont besoin pour exécuter la méthode submitchanges avant de finir l'insertion dans d'autres tables, afin que je puisse acquérir une Identité. J'ai été la recherche par le biais de l'internet et ne pourrais pas trouver comment créer une transaction dans linq to sql. J'ai mis des commentaires dans le code où je veux la transaction.
var created = false;
try
{
var newCharacter = new Character();
newCharacter.characterName = chracterName;
newCharacter.characterLevel = 1;
newCharacter.characterExperience = 0;
newCharacter.userUsername = userUsername;
newCharacter.characterClassID = ccslst[0].characterClassID;
//Open transaction
ydc.Characters.InsertOnSubmit(newCharacter);
ydc.SubmitChanges();
foreach (var ccs in ccslst)
{
var cs = new CharacterStat();
cs.statId = ccs.statID;
cs.statValue = ccs.statValue;
cs.characterID = newCharacter.characterID;
ydc.CharacterStats.InsertOnSubmit(cs);
}
var ccblst = ydc.ClassBodies.Where(cb => cb.characterClassID == newCharacter.characterClassID);
foreach (var ccb in ccblst)
{
var charBody = new CharacterBody();
charBody.bodyId = ccb.bodyId;
charBody.bodyPartId = ccb.bodyPartId;
charBody.characterID = newCharacter.characterID;
ydc.CharacterBodies.InsertOnSubmit(charBody);
}
ydc.SubmitChanges();
created = true;
//Commit transaction
}
catch (Exception ex)
{
created = false;
//transaction Rollback;
}
return created;
EDIT: j'ai Oublié de mentionner que le cdy est mon datacontext
Vous devez vous connecter pour publier un commentaire.
Envelopper le tout dans un
TransactionScope
. Appeltransaction.Complete()
à l'endroit où vous souhaitez engager. Si le code quitte le bloc sansComplete()
appelée, la transaction sera annulée. Cependant, après avoir regardé @s_ruchit la réponse de ré-examen de votre code, vous pourriez probablement réécrire ce pour ne pas nécessiter unTransactionScope
. Le premier exemple utilise laTransactionScope
avec votre code est. Le deuxième exemple fait quelques changements mineurs, mais accomplit le même but.Un endroit où vous devez utiliser la
TransactionScope
est lorsque vous êtes à la lecture d'une valeur à partir de la base de données et l'utiliser pour définir une nouvelle valeur sur un objet en cours d'ajout. Dans ce cas, le LINQ transaction ne couvre pas la première lire, il suffit de l'envoyer plus tard de la nouvelle valeur. Depuis que vous êtes à l'aide de la valeur à partir de la lecture pour calculer une nouvelle valeur pour l'écriture, vous avez besoin de la lire pour être enveloppé dans la même transaction afin de s'assurer qu'un autre lecteur de ne pas calculer de la même valeur et d'éviter que votre changement. Dans votre cas, vous ne faites que des écritures de sorte que la norme de LINQ transaction devrait fonctionner.Exemple 1:
Exemple 2:
System.Activities.Statements
ouSystem.Transactions
? Je n'ai jamais utilisé avant.System.Activities.Statements
, sinon utilisezSystem.Transactions
.Vous n'avez pas besoin de faire de Transaction explicite de mise en Œuvre lors de l'utilisation de LINQ to SQL. Tous les DB opérations sont enveloppés dans une transaction par défaut.
Ex:
Toutes les opérations entre db DataContext de l'initialisation et de la db.SubmitChanges() sont enroulées autour d'une Base de données de Transactions par .Net veillant à ce que votre base de données afin d'être en cohérence et l'intégrité du bien entretenues entre les tables.
Lire un article de Scott Guthrie ici :- http://weblogs.asp.net/scottgu/archive/2007/07/11/linq-to-sql-part-4-updating-our-database.aspx