2011-10-06 15 views
6

Come si esegue il mapping del tipo NHibernate al tipo TIME di SQL Server? Sto usando NH 3.2 e mappa per codice.Tipo dati ora NHibernate e SQL 2008

public class Schedule 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual TimeSpan Time { get; set; } 
} 

Qui è la mia classe di mappatura

public class ScheduleMapping : ClassMapping<Schedule> 
{ 
    public ScheduleMapping() 
    { 
     Id(x => x.Id, x => x.Generator(Generators.Native)); 
     Property(x => x.Name, x => x.NotNullable(true)); 
     Property(x => x.Time, x => x.NotNullable(true)); 
    } 
} 

Ora, quando creo database da questa colonna "Time" ha tipo BIGINT SQL invece di TEMPO. Ho letto l'articolo this e l'articolo that ma non mi è chiaro come applicare una di queste soluzioni.

=========== EDIT ====================

che ho creato e inserito nuovo orario in questo modo:

var newSchedule = new Schedule { 
        Name = "My Schedule", 
        Time = new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, 0) 
        }; 
session.SaveOrUpdate(newSchedule); 

quando questi dati è stato inserito (circa 07:27) il tempo di colonna contenuta valore '700.200.000.000', che potrebbe essere zecche, ma la cosa più importante era che quando ho chiesto DB per questi valori

var retrievedSchedules = session.QueryOver<Schedule>().List(); 

la proprietà Time è stata impostata correttamente su 19: 27.Origin volevo che la proprietà Time rappresentasse l'ora in cui Schedule dovrebbe funzionare. Anche se il tipo di dati di SQL Server per questa colonna è stato definito come BIGINT e il valore è rappresentato come tick (molto probabilmente), dopo il recupero è stato correttamente transitato in un tempo, che è quello che volevo. Questa non è più una domanda, ma lascerò questo, si spera, a beneficio di qualcun altro.

risposta

3

Questo, nella vostra mappatura dovrebbe risolvere il problema:

Property(x => x.Time, x => x => { x.NotNullable(true); x.Type<TimeAsTimeSpanType>(); }); 

Per impostazione predefinita, NH utilizzerà x.Type<TimeSpanType>() come tipo di NH per il tipo CLR Time ... che mappa a SQL Server 2008 come bigint .

Dai un'occhiata qui: http://jameskovacs.com/2011/01/26/datetime-support-in-nhibernate/. Copre le diverse mappature Clr -> NH -> Db per le date & volte.

+0

Sì, ha funzionato esattamente come lei ha suggerito. Ero a conoscenza del tipo TimeAsTimeSpanType ma non riuscivo a capire come specificarlo nella mia classe di mappatura. Grazie! – user981375

Problemi correlati