2010-05-20 14 views
14

Estoy usando Fluent Nhibernate y Nhibernate para mi proyecto actual. Necesito registrar el tiempo al milisegundo. Tengo esto para mi asignaciónNiberhate y milisegundos faltantes

  Map(x => x.SystemDateTime) 
      .CustomType("Timestamp") 
      .Not.Nullable(); 

I genertaed los archivos hbm.xml y la línea es la siguiente:

<property name="SystemDateTime" type="Timestamp"> 
    <column name="SystemDateTime" not-null="true" /> 
</property> 

He leído esta es la solución, pero los registros de la base de datos no hacer tener los milisegundos. ¿Alguien ha resuelto este problema? Y también probé CustomSqlType.

Gracias

+2

Qué base de datos se está utilizando, y cuál es el tipo (en base de datos) de la columna Timestamp? – AlexCuse

+0

también, los datos que ya tenía se han truncado y esa información se ha perdido. – Jaguar

+0

También me gustaría saber qué DB se está utilizando. SQLite, por ejemplo, no almacena milisegundos y requiere soluciones temporales. –

Respuesta

13

usamos el mismo enfoque que usted y lo hace almacenar correctamente los milisegundos. Si no siempre lo ha hecho de esa manera, aunque sus registros anteriores hayan perdido sus milisegundos.

Suponiendo que desea almacenar milisegundos para todas sus campos de fecha y hora, se puede utilizar una convención:

public class OurPropertyConventions : IPropertyConvention 
{ 
    public void Apply(IPropertyInstance instance) 
    { 
     Type type = instance.Property.PropertyType; 
     if (type == typeof(DateTime) || type == typeof(DateTime?)) 
      instance.CustomType("Timestamp"); 
    } 
} 

Sus asignaciones pueden ahora ser simplemente:

Map(x => x.SystemDateTime).Not.Nullable(); 
+0

Cualquier idea si esto se puede hacer en la configuración, es decir. 'Fluently.Configure(). Conventions.Add (...)'? –

+1

var factory = Fluido.Configuración() .Mappings (m => m.Fluj.Main.Convenciones.Add (new TimestampConvention())) .BuildSessionFactory(); – daanl

+0

@AshBurlaczenko Otro ejemplo de cómo agregar convenciones a la configuración sería 'var sessionFactory = Fluently.Configure (rawConfig) .Database (PersistenceConfigurer) .Mappings (m => m.FluentMappings.AddFromAssembly (typeof (OurPropertyConventions) .Assembly). Conventions.AddFromAssemblyOf ()); ' – Manfred

1

Esto no funcionó para mí :

Map(x => x.DateCreated).Column("DATE_CREATED").CustomSqlType("TIMESTAMP(6) WITH TIME ZONE").Not.Nullable(); 

si bien esto hizo:

Map(x => x.DateCreated).Column("DATE_CREATED").CustomType("timestamp").CustomSqlType("TIMESTAMP(6) WITH TIME ZONE").Not.Nullable(); 

no tengo ni idea de por qué, sin embargo:/

+0

Para mí CustomType (" timestamp ") funcionaba pero CustomType (" Timestamp ") no – AdrianCogiel

2

volver a visitar esta, ya que las respuestas anteriores fueron ligeramente incompleta.

Suponiendo que desea todos los campos DateTime almacenados con detalles completos y precisión de milisegundos, use TIMESTAMP(6) WITH TIME ZONE como el tipo de columna SQL. Usted necesitará una convención propiedad de FluentNHibernate:

using System; 
using FluentNHibernate.Conventions; 
using FluentNHibernate.Conventions.AcceptanceCriteria; 
using FluentNHibernate.Conventions.Inspections; 
using FluentNHibernate.Conventions.Instances; 

internal class DateTimeMapsToTimestampConvention 
    : IPropertyConvention, IPropertyConventionAcceptance 
{ 
    public void Apply(IPropertyInstance instance) 
    { 
     instance.CustomType<NHibernate.Type.TimestampType>(); 
    } 

    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) 
    { 
     criteria.Expect(x => x.Type == typeof(DateTime) 
      || x.Type == typeof(DateTime?)); 
    } 
} 

A continuación, añadir esta convención a su fluidez código de edificio de la fábrica sesión de configuración:

var factory = Fluently.Configure().Mappings(
    m => assemblies.ForEach(
    assembly => m.FluentMappings.AddFromAssembly(assembly) 
       .Conventions.Add(new DateTimeMapsToTimestampConvention()))) 
      .BuildSessionFactory(); 
Cuestiones relacionadas