2009-12-23 4 views
5

Esiste un modo per utilizzare SessionFactory.GetClassMetadata() o qualsiasi altro metodo di cui si è a conoscenza per ottenere dinamicamente la dimensione massima di una colonna varchar sottesa a una stringa di classe NHibernate?Trova le dimensioni delle colonne sottostanti tramite i metadati NHibernate

Per chiarire, non sto cercando di leggere un attributo di lunghezza specificato nel file di mapping NHibernate. Voglio dedurre la lunghezza effettiva della colonna del database.

risposta

1

Quando il factory Session viene generato, il motore NH non verifica (e recupera) il database sottostante. Per il tuo caso o fornisci una mappatura "ricca" per avere tutto disponibile in fase di esecuzione, OPPURE realizza una funzione che legge le informazioni necessarie dal DB (cioè seleziona * da sys.columns ..... per sql-server) quando bisogno di essa.

mente che una ricca mappatura permette anche il motore NH a fare alcune automazioni (come il controllo se la dimensione della stringa passata è maggiore della lunghezza del n) della colonna varchar()

+0

Grazie, Jaguar. Per mappatura ricca intendi semplicemente una mappatura che contiene attributi di lunghezza che corrispondono alle dimensioni delle colonne del database? –

+0

sì btw commentando la mia risposta mi avrebbe allertato sul tuo commento. Le risposte non devono essere usate per una discussione – Jaguar

6

vedere il codice qui sotto per due diversi modi è possibile ottenere la dimensione della colonna per una stringa dai metadati NHib.

Cheers,
Berryl

[Test] 
    public void StringLength_DefaultIs_50_v1() 
    { 
     _metadata = _SessionFactory.GetClassMetadata(typeof(User)); 
     var propertyType = _metadata.GetPropertyType("Email") as StringType; 
     Assert.That(propertyType.SqlType.Length, Is.EqualTo(50)); 
    } 

    [Test] 
    public void StringLength_DefaultIs_50_v2() 
    { 
     var mapping = _Cfg.GetClassMapping(typeof(User)); 
     var col = mapping.Table.GetColumn(new Column("Email")); 
     Assert.That(col.Length, Is.EqualTo(50)); 
    }