2009-03-27 9 views
0

J'utilise la classe SchemaExport dans NHibernate pour générer ma base de données à partir de mes fichiers .hbm.xml. Y at-il un moyen de définir la graine d'identité sur mes tables à 0 plutôt que 1? Pour les tables de référence, je préfère que tous mes identifiants d'état initiaux soient mis à 0, et je ne veux pas avoir à réinitialiser cette valeur chaque fois que je régénère ma base de données en mode développement. J'utilise SQL Server 2005, NHibernate version 1.2.1.Définir l'identité de la graine à 0 à l'aide de NHibernate SchemaExport

Répondre

3

Il est préférable de ne PAS utiliser les colonnes Identity avec NHibernate si possible; Ils incitent NHibernate à effectuer plus de déplacements dans la base de données, rendent le traitement par lots impossible et, en gros, brisent le modèle d'unité de travail. Ceci est discuté sur nhibernate.info et dans quelques blog posts comme celui-ci. Guid.comb ou Hi-Lo est généralement une meilleure option.

Si vous voulez vraiment continuer à utiliser l'Identité, et avoir des origines à partir de 0, alors voici quelques possibilités (non testées).

Juste une supposition, mais vous auriez probablement besoin d'abord définir votre unsaved-value="-1" comme ceci:

Cela permet NHibernate de savoir que l'identité de -1 signifie que l'objet est pas enregistré (transitoire).

Vous devez également vous assurer que tous les id des entités ont une valeur par défaut de -1 aussi (par défaut nombres évidemment à 0):

public class Order { 
    public virtual long Id{get; private set;} 
    public Order(){ 
     Id = -1; 
    } 
} 

Il est assez yukky! Ensuite, il s'agit de savoir comment faire démarrer SchemaExport à partir de 0. Il peut déjà le faire (en utilisant la valeur +1 comme valeur de départ). Vérifiez pour voir si cela fonctionne. Si ce n'est pas le cas, vous devrez peut-être corriger le problème ou remplacer le fichier hbm.xml. Une façon serait d'utiliser XSLT pour transformer les fichiers HBM générés. Encore une fois, joli yukky.

+0

Vous avez raison, c'est un processus moche. Je pense qu'un refactor est en ordre. Merci pour le conseil. –

Questions connexes