Bonjour à Tous,
Pour profiter des Blocks d'applications que propose Entreprise Library 3.1 (Exception Policy, Logging Validation etc..) je pensais utiliser le DAAB (Data Access Application Block) qui est la 'brique' d'accès aux données de Ent Lib 3.1
Jusque là cela aurait pas etre exploitable ...Mais mon problème est que dans un même dataset j'utilise les DataRelations. Elles permettent de maintenir une logique relationnelle entre les DataTables de ce Dataset ce qui est très utile lors de mise à jour de Row parente (génération de Primary Key par le SGBD puis cette PK est rafraichie sur le client...on peut alors utilisée cette PK pour effectuer des mises à jour des Rows Enfants qui connaissent leurs parents grace à leur Foreign Key...
En résumé, les datarelations font perdurer les relations Parent / Enfant de deux DataTables même lorsque l'une d'elle est en train d'etre ajouté ou modifiés en Base...Une contrainte est que ces deux DataTables doivent etre dans un même DataSet car c'est lui qui contient les DataRelations...Ma configuration est maintenant posée, passons à la problématique..
J'aimerais donc exploiter la brique DAAB mais je m'apercois que tout est trop automatiser , notamment aux niveaux de la mise à jour des données. En effet un des problèmes est que les Adapters utilisés (comme le DataAdapter qui est une classe mère de TableAdapter ou de DBDataAdapter ) possèdent des arguments par défauts tels que
AcceptChangesDuringFill = true;
AcceptChangesDuringUpdate = true;
Ce qui réinitialise les états des rows à Unchanged dès la fin de la méthode Update() ou Fill()...
ils ne peuvent pas être surcharger avant l'appel de Updataset car le DataAdapter est créé, utilisé puis détruit en interne de la fonction UpdataDataset...voila un risque d'utiliser des outils 'pret à l'emploi' car je souhaite gérer moi même la réinitialisation des RowState (à Unchanged).Je rappele que le décisionnel des Commands à executer est déterminé par les RowStates (Added, Modified etc) pour que l'adapter déclenche les Commands correspondantes (INSERT, UPDATE etc...). Ces méthodes sont traitées ligne par ligne ...
Mon souci est que je je passe mon dataset unique à la méthode comme ceci : (db est une DataBase)
int rowsAffected = db.UpdateDataSet(dataset, DataTable.TableName, insertCommand, updateCommand, deleteCommand, txMgr.GetTransaction(db));
Les XCommand concerne une seule DataTable, et cette fonction doit mettre à jour seulement cette DataTable...Mais je constate que c'est TOUS les rowstates de toutes les Datatables de ce DataSet qui sont remis à Unchanged après l'appel de cette méthode...Or j'aimerais que les AcceptChanges soit lancée UNIQUEMENT sur la Datatable concerné afin de préserver les états des rows des autres Tables..
Une solution serait de modifier les sources (Heureusement Open Source de Entreprise Library...mais je n'arrive pas à exploiter les Assembly regénérer )
c'est ce que j'ai tenté mais un erreur survient lors du premier appel des fonction de Ent Lib..
Impossible de charger le fichier ou l'assembly
'Microsoft.Practices.EnterpriseLibrary.Common, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null' ou une de ses dépendances.
La définition trouvée du manifeste de l'assembly ne correspond pas à la référence de l'assembly. (Exception de HRESULT : 0x80131040)
Une autre solution est de copier le Dataset et d'effectuer la mise à jour de cette copie pour préserver les rowtates de l'original...mais cela fait il aussi une copie des données ou seulement ou copie de l'architecture du dataset..
Dataset DStoUpdate = OriginalDS.GetChanges().copy();
int rowsAffected = db.UpdateDataSet(DStoUpdate, DataTable.TableName, insertCommand, updateCommand, deleteCommand, txMgr.GetTransaction(db));
En esperant ne pas avoir été trop long sur l'énoncé, j'espère que cela vous aura été aussi instructif que moi...
BINOME de ECOSMOSE
Association ecologique d'actions de culture et d'Informations