2009-12-23 14 views
5

¿Hay alguna manera de utilizar SessionFactory.GetClassMetadata() o cualquier otro método que conozca para obtener dinámicamente el tamaño máximo de una columna varchar que subyace a una propiedad de cadena de la clase NHibernate?Buscar tamaño de columna subyacente a través de Metadatos NHibernate

Para aclarar, no estoy buscando leer un atributo de longitud que esté especificado en el archivo de mapeo NHibernate. Quiero deducir la longitud real de la columna de la base de datos.

Respuesta

1

Cuando se genera la fábrica de la sesión, el motor NH no comprueba (y recupera) cuál es la base de datos subyacente. Para su caso, puede proporcionar una asignación "completa" para tener todo disponible en tiempo de ejecución, O hacer una función que lea la información necesaria de la base de datos (es decir, seleccione * de sys.columns ..... para sql-server) cuando necesito.

Eso sí que un mapeo ricos también permite que el motor NH hacer algunos automatismos (como la comprobación de si el tamaño de la cadena pasada es mayor que la longitud de n columna varchar la())

+0

Gracias, Jaguar. Mediante el mapeo rico, ¿se refiere a una asignación que contiene atributos de longitud que corresponden a los tamaños de columna de la base de datos? –

+0

sí btw al comentar mi respuesta me habría alertado sobre su comentario. Las respuestas no se deben usar para una discusión – Jaguar

6

ver el código de abajo para dos formas diferentes puede obtener el tamaño de columna para una cadena de metadatos NHib.

Saludos,
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)); 
    } 
Cuestiones relacionadas