2009-08-26 12 views
9

Soy nuevo en NHibernate y Fluido NHibernate.Cartografía fluida de NHibernate

Suponiendo que he una situación como la siguiente

Table Activities (uniquidentier ID, varchar ActivityName) 
Table ActivityParameters(uniqueidentifier ID, varchar ParameterName, 
varbinary(8000) ParameterValue) 

y la siguiente clase

public static Acivity 
{ 
    ....... 
    public virtual Guid Id {get; private set;}  
    public virtual string ActivityName {get; private set;} 
    public virtual IDictionary<string, object> ActivityParameters {get; private set;} 
} 

¿Cómo puedo escribir el classmap? Más específicamente, ¿cómo puedo escribir el mapeo para los parámetros de actividad?

Respuesta

16

un colega señaló correo a this site.

sobre la base de esa discusión, I' he venido al

Table("Activities"); 
     Id(x => x.Id).Column("ID").GeneratedBy.Guid(); 
     Map(x => x.ActivityName).Not.Nullable().Length(50); 
     HasMany(x => x.ActivityParameters) 
      .KeyColumn("ActivityID") 
      .AsMap<string>(idx => idx.Column("ParameterName"), elem => elem.Column("ParameterValue")) 
      .Not.LazyLoad() 
      .ForeignKeyCascadeOnDelete() 
      .Table("ActivityParameters"); 

tengo que probar esto.

+0

¡Funciona! ¡Gracias a todos por apuntar la dirección! – DaeMoohn

+3

Excelente trabajo con su propia solución. Hasta el voto para eso ... – Skittles

0

This parece útil.

teoría que debe ser similar:

public class ActivityClassMap : ClassMap<Activity> 
{ 
    ... 
    HasMany(x => x.ActivityParameters) 
     .AsMap(x=>x.NameOfParameterOrWhatever) 
     .KeyColumnNames.Add("ParameterId"); 
    ... 
} 

Pero eso es sólo una pequeña investigación a través de Google - Yo no probar esto en la práctica.

P.s. no te olvides de recoger la versión más nueva.

+0

Muchas gracias, voy a intentar esto. ¡Gracias de nuevo! – DaeMoohn

0

Basado en su pista, me he dado:

WithTable("Activities"); 
Id(x => x.Id).ColumnName("ID").GeneratedBy.Guid(); 
Map(x => x.ActivityName).Not.Nullable().WithLengthOf(50); 
HasMany(x => x.ActivityParameters) 
     .Cascade.Delete() 
     .KeyColumnNames.Add("ActivityID") 
     .AsMap("ParameterName") 
     .AsMap("ParameterValue") 
     .WithTableName("ActivityParameters"); 

pero me da un error, referencias clase funcional no asignada: System.Object. :(

Más tarde editar: Tengo la última versión de Fluido, y ahora el código aparece así:

Table("Activities"); 
     Id(x => x.Id).Column("ID").GeneratedBy.Guid(); 
     Map(x => x.ActivityName).Not.Nullable().Length(50); 
     HasMany(x => x.ActivityParameters) 
      .KeyColumn("ActivityID") 
      .ForeignKeyCascadeOnDelete() 
      .Table("ActivityParameters"); 
0

que realmente se necesita para definir qué tipo de objetos de valor de su propiedad en IDictionary contiene - NHibernate no sabe cómo asignar. se debe utilizar una clase específica en lugar de. a continuación, especificar la asignación de esta clase también.

-1

Por favor perdone mi ignorancia.

Trabajé con NHibernate hace aproximadamente 6 meses y todavía estábamos optando por la asignación de integración XML, y luego compilando las asignaciones XML dentro de la biblioteca o en absoluto.

¿Es esto nuevo asignar tablas relacionales y objetos de clase directamente desde dentro del código?

Escuché que esto venía de alguna manera con el Entity Framework saliendo especificando el mapeo justo encima de cada elemento de una clase entre corchetes. Por lo tanto, dado que Entity Framework era únicamente para ser utilizado con SQL Server, no pudimos pensar en usarlo ya que estábamos trabajando en un entorno de varias bases de datos con SQL Server, Oracle y SQLite.

¡Gracias por cualquier iluminación sobre el tema! :-)

+0

Este es un enfoque alternativo a tener que escribir archivos hbm.xml. – DaeMoohn

+0

Gracias por su respuesta! Me interesaré mucho cuando vuelva a trabajar con NHibernate. –

Cuestiones relacionadas