Nous avons une application Silverlight qui utilise les services de données WCF. Nous voulons ajouter une fonctionnalité de journalisation: lorsqu'une nouvelle ligne est générée, la clé primaire de cette nouvelle ligne est également enregistrée dans la table de journalisation. La génération de ligne et la journalisation doivent se produire dans la même transaction. Les clés primaires sont générées via la base de données (en utilisant le mot clé IDENTITY).Services de données ADO.NET sur Silverlight: utilisation de la clé générée dans la même transaction
Ceci peut être mieux illustré par un exemple. Ici, je crée une nouvelle ligne Customer et, dans la même transaction, j'écris la clé primaire du client dans une ligne AuditLog. Cet exemple utilise un client lourd et Entity Framework:
using (var ts = new TransactionScope())
{
AuditTestEntities entities = new AuditTestEntities();
Customer c = new Customer();
c.CustomerName = "Acme Pty Ltd";
entities.AddToCustomer(c);
Debug.Assert(c.CustomerID == 0);
entities.SaveChanges();
// The EntityFramework automatically updated the customer object
// with the newly generated key
Debug.Assert(c.CustomerID != 0);
AuditLog al = new AuditLog();
al.EntryDateTime = DateTime.Now;
al.Description = string.Format("Created customer with customer id {0}", c.CustomerID);
entities.AddToAuditLog(al);
entities.SaveChanges();
ts.Complete();
}
C'est un problème trivial lors de l'élaboration d'un client lourd en utilisant Entity Framework.
Cependant, l'utilisation des services de données Silverlight et de ADO.NET:
- SaveChanges ne peut être invoqué de manière asynchrone
- Je ne suis pas sûr TransactionScope est disponible
- Je ne suis pas sûr si les clés générées peut être reflété dans le client Éditer: Selon Alex James ils sont en effet reflétés dans le client
Alors, cela sera-t-il encore possible?