2009-08-28 8 views
0

Supposons que j'ai une table des produits avec des colonnes: Id, Nom, Prix et en utilisant NHibernate (ou ActiveRecord) Je carte la table Poco:Validation automatique du schéma en utilisant NHibernate/ActiveRecord

public class Product 
{ 
    public virtual long Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual double Price { get; set; } 
} 

maintenant si un jour une nouvelle colonne nommée ShipmentPrice (supposons que c'est aussi double) sera ajouté à la table des produits, est-ce que je peux le savoir automatiquement? Pour dire automatiquement, je veux dire ajouter du code pour faire cela ou obtenir une exception? (je suppose que je n'ai pas le contrôle sur les colonnes du tableau ou un moyen de connaissez des modifications apportées au schéma de la table à l'avance)

Répondre

0

Vous pouvez utiliser NHibernate's SchemaValidator, mais IIRC il vérifie seulement que vos entités mappées sont valides donc il ne vérifie pas s'il y a plus de colonnes que de propriétés mappées car cela ne casserait pas vraiment votre application.

3

Vous vous souvenez correctement, Mauricio. Le code suivant montre comment vous pouvez créer ou mettre à jour un schéma. La mise à jour s'exécutera lorsque Validate() déclenchera une exception. Aucune exception ne sera levée lorsqu'un champ est disponible dans la base de données mais pas dans la configuration. Il est parfaitement légal d'avoir des champs supplémentaires: vous ne voulez pas qu'ils soient supprimés, j'espère? Cela pourrait causer d'énormes dommages ...

Le code suivant montre Test, Créer, Valider et Mettre à jour, chaque étape avec la gestion des exceptions appropriée. Le code est simplifié, mais il devrait vous donner un contrôle sur la façon de faire une validation.

Ce code aide avec les configurations ORM Entity-centric (POCO), où vous pouvez ajouter un champ à votre classe et il sera automatiquement mis à jour dans la base de données. Pas avec table-centrique, où les champs mènent.

// executes schema script against database 
private static void CreateOrUpdateSchema(Configuration config) 
{ 
    // replace this with your test for existence of schema 
    // (i.e., with SQLite, you can just test for the DB file) 
    if (!File.Exists(DB_FILE_NAME)) 
    { 
     try 
     { 
      SchemaExport export = new SchemaExport(config); 
      export.Create(false, true); 
     } 
     catch (HibernateException e) 
     { 
      // create was not successful 
      // you problably want to break out your application here 
      MessageBox.Show(
       String.Format("Problem while creating database: {0}", e), 
       "Problem"); 
     } 
    } 
    else 
    { 

     // already something: validate 
     SchemaValidator validator = new SchemaValidator(config); 
     try 
     { 
      validator.Validate(); 
     } 
     catch (HibernateException) 
     { 
      // not valid, try to update 
      try 
      { 
       SchemaUpdate update = new SchemaUpdate(config); 
       update.Execute(false, true); 
      } 
      catch (HibernateException e) 
      { 
       // update was not successful 
       // you problably want to break out your application here 
       MessageBox.Show(
        String.Format("Problem while updating database: {0}", e), 
        "Problem"); 
      } 
     } 
    } 
} 

- Abel -

Questions connexes