2008-11-18 6 views
5

Comment est-il possible de définir des valeurs de colonne spéciales lors de la mise à jour/insertion d'entités via NHibernate sans étendre les classes de domaine avec des propriétés spéciales? Par exemple: dans mon cas, je voudrais obtenir un objet et juste un instant avant de mettre à jour/insérer db ajouter à cet objet quelques informations supplémentaires (comme l'ID utilisateur ou le nom de l'ordinateur) en utilisant IInterceptor. En d'autres termes, je voudrais ajouter quelques colonnes à DB Table sans spécifier de nouvelles propriétés dans la classe de l'objet d'origine. Dois-je configurer/modifier/ajouter à mon Object.hbm.xml ou App.config dans ce cas? Le problème est que je ne peux pas changer mes objets d'origine et mes classes de base.Alors je dois comprendre si possible d'ajouter des informations à la table DB sans changer les objets d'origine (même pas hérité des classes de base)Implémentation de NHibernate IInterceptor (ajouter des propriétés à la table DB que la classe de domaine d'origine n'a pas)

Exemple:

objet original a: FirstName ,LastName,Birthday,Address properties

Customer.hbm.xml a:

<property name="FirstName" column="FirstName" type="string" not-null="true" length="64" /> 
<property name="LastName" column="LastName" type="string" not-null="true" length="64" /> 
<property name="Birthday" column="Birthday" type="DateTime" not-null="true" /> 
<property name="Address" column="Address" type="string" not-null="true" /> 

Ma classe Interceptor a méthode:

public bool OnSave(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types) 

à ce moment-là ou peut-être même avant d'enregistrer, je dois ajouter les colonnes supplémentaires table client DB 2 (Nom de l'ordinateur et le nom de l'utilisateur par exemple) que les paramètres propertyNames[] et state[] n » Je les ai depuis le début, donc cela devrait être fait à la volée.

La table MY DB Customer a toutes les colonnes que j'ai décrites ci-dessus.

Merci.

Répondre

1

Je ne l'ai pas essayé, mais vous devriez pouvoir ajouter les propriétés dynamiques à la configuration avant la création en usine. Ensuite, vous pouvez remplir ces valeurs dans votre intercepteur. Ex, récupérez la classe PersistentClass pertinente à partir de config.ClassMappings, puis ajoutez-y vos propriétés.

private void AddProperty(
     PersistentClass pc, 
     string propertyName, 
     string columnName, 
     IType dataType) 
    { 
     SimpleValue val = new SimpleValue(pc.Table); 
     Column col = new Column(dataType, 0); 
     col.Name = columnName; 
     val.AddColumn(col); 
     val.Type = dataType; 
     Property prop = new Property(val); 
     prop.IsUpdateable = true; 
     prop.Name = propertyName; 
     prop.PropertyAccessorName = "nosetter.camelcase"; 
     prop.Cascade = "none"; 
     pc.AddNewProperty(prop); 
    } 
Questions connexes