2010-10-26 7 views
2

Je suis en train de réécrire notre application. Nous construisons DataMappers pour travailler dans notre DAL. Ma question concerne la situation où j'ai un objet complexe de la BLL qui est passé à DataMapper pour être conservé.DAL Datamapper objets gras persistants

Disons que cet objet a beaucoup de propriétés, y compris des listes d'autres objets.

i.e. ...

public class Customer 
{ 
    public String name; 
    public String age; 
    public String ShoeSize; 
    public List<Address> a; 
    public List<Orders> o; 
{ 

Dans une situation où peut-être "l'âge" était le seul champ qui a été mis à jour dans le BLL.

Quelle est une bonne pratique pour persister dans la base de données?

Conserveriez-vous toute la structure? ou Comment puis-je structurer ceci afin que mon DataMapper sache quels champs ont changé de sorte que je n'ai pas eu à mettre à jour la structure entière dans la base de données? Je suppose que je pourrais avoir une sorte de champ IsDirty pour chaque propriété, mais cela pourrait devenir très difficile.

Merci,

MW

Répondre

1

Si vous conservez l'objet d'origine en mémoire et transmettre une nouvelle « version » avec les changements, vous pouvez vérifier le nouvel objet pour les changements et seulement économiser que.

public class CustomerMapper { 
    // ... 
    public void Update(Customer original, Customer update) 
    { 
     // check each property for changes 
    } 
    // ... 
} 

Après la mise à jour, vous remplacez l'objet d'origine par le nouveau. Mais soyez conscient des problèmes de concurrence si vous avez plusieurs threads.

+0

Merci. Cela peut fonctionner. J'ai juste besoin de regarder comment gérer ces problèmes de concurrence. –

+0

Ou récupérez simplement l'original de la base de données et comparez-le avec celui modifié avant d'enregistrer les modifications. – jgauffin

+0

@jgauffin Cela fonctionnerait aussi mais nécessite un voyage supplémentaire à la base de données. Cela dépend du système et de la configuration. –

0

Pourquoi réinventer la roue? J'ai fait quelques couches de données et ça ne vaut pas le coup. Tous ces problèmes (et beaucoup que vous avez pensé) ont déjà été pris en charge lors de l'utilisation d'un ORM existant. Mon préféré est nhibernate. Il peut soit vous donner beaucoup de puissance ou tout réparer avec une configuration presque nulle.

Regardez ici:

+0

Merci. Ce serait bien si je pouvais en utiliser un sur ce projet. –

+0

Pourquoi pas? Vous réécrivez l'application. =) Vous les objets gras existants devraient fonctionner correctement avec nhibernate tant que les listes/collections implémente IList ou Set. En d'autres termes, vous devriez seulement utiliser nhibernate au lieu de votre datamapper actuel (que vous construisez). Pas beaucoup de changements au code appelant. – jgauffin