2009-12-21 15 views
12

Fluido NHibernate no le gusta esto, lanzando un error:¿Automatización NHIbernate fluida de la lista <string>?

{"Association references unmapped class: System.String"}

OK bien, puedo ver por qué esto causaría un problema - pero ¿cuál es la mejor solución?

Realmente no quiero que almacene una lista delimitada de cadenas en un solo campo, esto se pondría feo si mi lista contiene muchas cadenas.

Yo tampoco quiero realmente una tabla 'cuerda', por razones obvias.

Supongo que puedo resolver esto envolviendo mi List<string> dentro de una clase, pero esto se siente un poco pesado. Sin embargo, estoy empezando a pensar que es la mejor solución.

¿Cuál es la mejor manera de obtener fluidez NHibernate para manejar esto?

Espero totalmente que estos valores se almacenen en otra tabla. Pensé que quizás podría haber configurado alguna convención de automatización que instruya a NHibernate 'Si ve un class X que contiene List<*some primitive type*>, siga adelante y cree automáticamente una tabla de referencia que se corresponda con esta colección.

Se siente un poco pesado para envolver todas las colecciones de una clase. Si esa es la mejor solución, entonces que así sea.

+1

si no lo quiere como una cadena delimitada en un solo campo, y no lo quiere en otra tabla, entonces * ¿dónde *? esto sigue siendo una base de datos relacional ... –

+0

No me molesta cómo la base de datos relacional maneja esto. Me pregunto cómo puedo hacer que el automapping infiera que esto es lo que quiero hacer para las listas de cadenas * all * en mi modelo de dominio. – Alex

+0

@Alex: hasta donde sé, no hay forma de decirle a Fluffy NHibernate cómo mapear TODAS las listas de cadenas. La solución que proporciono en mi respuesta requiere una anulación para cada lista de cadenas en su modelo de dominio. Solo hay un par de líneas de código para cada anulación, así que no está mal ... –

Respuesta

7

Tuve este mismo problema hace unas semanas, con flotadores en lugar de cadenas.

how-do-you-automap-listfloat-or-float-with-fluent-nhibernate

Resulta que Automapping no funciona con tipos primitivos.

Editar - Esto ya no es cierto - el equipo FNH ha solucionado el problema

Hay una gran cantidad de código de ejemplo en la respuesta aceptada a mi pregunta, pero el punto clave es agregar un reemplazo para su listas de tipos primitivos ("rawy" en el ejemplo a continuación):

public class DlsAppOverlordExportRunData 
{ 
    public virtual int Id { get; set; } 
    // Note: List<float> needs overrides in order to be mapped by NHibernate. 
    // See class DlsAppOverlordExportRunDataMap. 
    public virtual IList<float> RawY { get; set; } 
} 


// Must be in different namespace from DlsAppOverlordExportRunData!!! 
public class DlsAppOverlordExportRunDataMap : IAutoMappingOverride<DlsAppOverlordExportRunData> 
{ 
    public void Override(AutoMapping<DlsAppOverlordExportRunData> mapping) 
    { 
     // Creates table called "RawY", with primary key 
     // "DlsAppOverlordExportRunData_Id", and numeric column "Value" 
     mapping.HasMany(x => x.RawY) 
       .Element("Value"); 
    } 
} 

yo esperaría el mismo enfoque para trabajar con ILists de cuerdas.

+0

Ok esto parece interesante. ¿Es esto algo que se puede definir a través de convenciones? Parece que FNH se está enfocando en las convenciones para personalizar la automatización. – Alex

+0

No lo creo. Obtuve la solución haciendo la pregunta en la lista de correo de Fluent, y creo que fue uno de los autores de FNH que me la dio. Si pudiera hacerse por una sola convención, creo que lo habría sugerido. –

1

Piénsalo de esta manera ... ¿cómo lo harías sin hibernar? Bueno, ¿probablemente tendrías una tabla con una clave externa y una columna de cadena? Ahora, ¿cómo haces eso con Hibernate? Configura otra clase con una propiedad de muchos a uno y de cadena. Luego mapea una colección de esa clase.

+0

Bien, punto tomado. Simplemente no me gusta tener que crear todas estas clases totalmente triviales para envolver colecciones primitivas. ¿Puedo hacer que el automapping infiera esto por mí? – Alex

+0

Oh, entonces ¿no necesitas crear otra clase? Creo que es posible ... http: //nhforge.org/doc/nh/en/index.html#collections-ofvalues ​​ver cómo dieron un ejemplo de un conjunto de entradas, parece que usted hace una colección regular y luego define un propiedad del elemento para su cadena. – dotjoe

4

Desde que publiqué mi primera respuesta, el equipo de Fluent NHibernate ha resuelto este problema.

Ahora puede automatizar los tipos de valores ILists of C# (strings, ints, floats, etc.).

Solo asegúrate de tener una versión reciente de FNH.

+0

Por desgracia, este es casi un año de retraso para mis necesidades, independientemente de que sea bueno ver que FNH implementó esto, fue el único obstáculo real que encontré al usarlo para una aplicación de LOB grande. – Alex

+0

Kudos Tom por regresar un año después para proporcionar esta actualización. – MushinNoShin

Cuestiones relacionadas