Aunque te sugeriria un pequenio cambio.  Mira las clases y archivos de mapeo
( no uso fluentNH).  Alli esta un test que corri y funciona.  Con este mapeo
si puedes hacer un <many-to-many> con propieades adicionales en la relacion.
Saludos,
Nestor Rodriguez


///// Clases


public class Profesor
    {
        public virtual int IdProfesor
        {
            get;
            set;
        }
        public virtual string NombreProfesor
        {
            get;
            set;
        }

        public virtual ICollection<ProfesorGrupo> Grupos
        {
            get;
            set;
        }

    }

    public class Grupo
    {
        public virtual int IdGrupo
        {
            get;
            set;
        }
        public virtual string NombGrupo
        {
            get;
            set;
        }
        public virtual int Anno
        {
            get;
            set;
        }

        public virtual ICollection<ProfesorGrupo> Profesores
        {
            get;
            set;
        }
    }

    public class ProfesorGrupo
    {

        public virtual Profesor Profesor
        {
            get;
            set;
        }

        public virtual Grupo Grupo
        {
            get;
            set;
        }

        public virtual DateTime? Fecha
        {
            get;
            set;
        }
    }


//// Mapeos

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain"
namespace="Domain">
  <class name="Profesor" table="Profesor">
    <id name="IdProfesor">
      <generator class="native"></generator>
    </id>
    <set name="Grupos" table="ProfesoresGrupos">
      <key column="Id_Profesor"/>
      <composite-element class="ProfesorGrupo">
        <parent name="Profesor"/>
        <many-to-one name="Grupo" class="Grupo" column="Id_Grupo"/>
        <property name="Fecha"/>
      </composite-element>
    </set>
  </class>

  <class name="Grupo" table="Grupo">
    <id name="IdGrupo">
      <generator class="native"></generator>
    </id>
    <set name="Profesores" table="ProfesoresGrupos" inverse="true">
      <key column="Id_Grupo"/>
      <composite-element class="ProfesorGrupo">
        <parent name="Grupo"/>
        <many-to-one name="Profesor" class="Profesor" column="Id_Profesor"/>
        <property name="Fecha"/>
      </composite-element>
    </set>
  </class>


  /// Test

  static void Main(string[] args)
        {
            var conf = new Configuration().Configure();
            new SchemaExport(conf).Create(true, true);
            var sessionFactory = conf.BuildSessionFactory();
            using (var session = sessionFactory.OpenSession())
            {
                using (var tx = session.BeginTransaction())
                {
                    tx.Begin();
                    var profesor = new Profesor();
                    var grupo = new Grupo();
                    var profesorGrupo = new ProfesorGrupo
                    {
                        Profesor = profesor,
                        Grupo = grupo,
                        Fecha = DateTime.Now
                    };
                    profesor.Grupos = new
Iesi.Collections.Generic.SortedSet<ProfesorGrupo>();
                    profesor.Grupos.Add(profesorGrupo);

                    session.Save(profesor);
                    session.Save(grupo);
                    tx.Commit();
                }
            }

            Console.ReadLine();

        }


2011/6/22 Nestor Andres Rodriguez <[email protected]>

> Hola Dennis.  Creeria que el inconveniente esta en que tu estas mapeando
> dos veces las mismas propiedades.  Si haces CompositeId().KeyReference, no
> es necesario que vuelvas a hacer un "References" a la misma propiedad.
>
> Saludos,
>
> 2011/6/22 Dennis Alba <[email protected]>
>
>> Haber te cuento Nestor:
>> 1- uso fluent Nhibernate, por tal motivo no eleve los ficheros hbm(no
>> las hay) ni las clases de mapeo pues se que la mayoria del foro usa
>> solo NHibernate.
>> 2- en realidad las clases las cree como si fueran tablas ya que al
>> menos Fluent (y creo que Nhibernate tambien)  pueden mapearte dos
>> entidades cuya relacion sea m-n reandote la 3ra tabla que las
>> relaciona siempre y cuando esta no tenga valores agregados, pero como
>> en mi caso necesito que la tabvla que relacion a las otras dos tenga
>> ademas de sus llaves P otros campos como la fecha ya el metodo que
>> trae Fluent no me sirve, por tal motivo es que tube que crear las
>> clases como si fueran las tablas.
>> de todas formas aqui te paso las clases de mapeo:
>>
>>       public GrupoMap()
>>       {
>>           // definicionde la tabla
>>           Table("P_GRUPO");
>>
>>           // definicion de la llave primaria de la tabla
>>           Id(x => x.IdGrupo).Column("ID_GRUPO").GeneratedBy.Native();
>>
>>           //campos a mapear
>>           Map(x => x.NombGrupo).Column("GRUPO").Nullable().Length(10);
>>           Map(x => x.Anno).Column("ANO").Nullable().Length(2);
>>       }
>>    }
>>       public GrupoMap()
>>       {
>>           // definicionde la tabla
>>           Table("P_GRUPO");
>>
>>           // definicion de la llave primaria de la tabla
>>           Id(x => x.IdGrupo).Column("ID_GRUPO").GeneratedBy.Native();
>>
>>           //campos a mapear
>>           Map(x => x.NombGrupo).Column("GRUPO").Nullable().Length(10);
>>           Map(x => x.Anno).Column("ANO").Nullable().Length(2);
>>       }
>>    }
>>
>>        public ProfesorGrupoMap()
>>        {
>>            // definicionde la tabla
>>            Table("P_PROFESOR_GRUPO");
>>
>>            // definicion de la llave primaria de la tabla
>>            CompositeId().KeyReference(x => x.p_Grupo, "ID_GRUPO")
>>                .KeyReference(x => x.p_Profesor, "ID_PROFESOR");
>>
>>            //campos a mapear
>>            Map(x =>
>> x.Fecha).Column("FECHA").Nullable().CustomSqlType("DATETIME");
>>            References(x => x.p_Profesor).Column("ID_PROFESOR");
>>            References(x => x.p_Grupo).Column("ID_GRUPO");//.Cascade.All();
>>        }
>>    }
>> Reitero, las tablas se mapean bien e incluso puedo insertar bien los
>> valores desde SQLServer, el problema esta cuando hago la inserccion a
>> la tabla P_PROFESOR_GRUPO desde la aplicacion
>> que crees??
>>
>> El 22/06/11, Nestor Andres Rodriguez <[email protected]> escribió:
>> > Por favor provee los archivos de mapeo.   Otra  cosa, no has pensado en
>> que
>> > el Profesor tenga su coleccion de grupos y viceversa ?  Pareciera como
>> si
>> > estuvieras mapeando un sistema modelado en tablas y relaciones en lugar
>> de
>> > objetos.
>> >
>> > Saludos
>> >
>> > 2011/6/22 Banzai <[email protected]>
>> >
>> >> Saludos tropa:
>> >> necesito ver si me pueden ayudar con el siguiente error que plantee en
>> >> el titulo de este debate
>> >> les pongo mi entorno completo para que puedan entender bien el
>> >> problema
>> >> tengo las siguientes clases:
>> >>
>> >>   public partial class Profesor
>> >>    {
>> >>       public virtual int IdProfesor { get; set; }
>> >>       public virtual string NombreProfesor { get; set; }
>> >>
>> >>    }
>> >>
>> >>    public partial class Grupo
>> >>    {
>> >>        public virtual int IdGrupo { get; set; }
>> >>        public virtual string NombGrupo { get; set; }
>> >>        public virtual int Anno { get; set; }
>> >>    }
>> >>
>> >>    public partial class ProfesorGrupo
>> >>    {
>> >>
>> >>        public virtual Profesor p_Profesor { get; set; }
>> >>
>> >>        public virtual Grupo p_Grupo { get; set; }
>> >>
>> >>        public virtual DateTime? Fecha { get; set; }
>> >>
>> >>        public override int GetHashCode()
>> >>        {
>> >>            return p_Profesor.GetHashCode() + p_Grupo.GetHashCode();
>> >>        }
>> >>
>> >>
>> >>        public override bool Equals(object obj)
>> >>        {
>> >>            if (ReferenceEquals(null, obj)) return false;
>> >>            if (ReferenceEquals(this, obj)) return true;
>> >>            var other = obj as ProfesorGrupo;
>> >>            if (other == null) return false;
>> >>
>> >>            return (p_Profesor == other.p_Profesor
>> >>                   && p_Grupo == other.p_Grupo
>> >>                   && Fecha == other.Fecha);
>> >>        }
>> >>
>> >>    }
>> >>
>> >> cuando hago el mapeo de estas entidades me quedan tres tablas P_GRUPO,
>> >> P_PROFESOR, P_PROFESOR_GRUPO, donde la ultima lo que hace no es mas
>> >> que relacionar las dos primeras, ya que contiene sus PK como llaves de
>> >> ella, Vamos que lo que hice fue modelar una relacion n-m entre las dos
>> >> primeras (P_GRUPO y P_PROFESOR).
>> >> El mapeo se realiza de manera perfecta, el problema esta cuando trato
>> >> de insertar, particularmente en P_PROFESOR_GRUPO.
>> >>
>> >> el flujo de las inserciones es el siguiente.
>> >>
>> >> 1ero inserto todos los grupos, FUNCIONA BIEN
>> >> 2do luego inserto a los profesores FUNCIONA BIEN
>> >> 3ro luego inserto a la clase que los relaciona pasandole ya que esta
>> >> entidad tiene un objeto de Grupo y profesor, pero cuando lo inserto da
>> >> el siguiente error
>> >>  "Índice 3 no válido para SqlParameterCollection con Count=3."
>> >>
>> >> alguien sabe que puede ser??
>> >> Mil gracias
>> >>
>> >> --
>> >> Para escribir al Grupo, hágalo a esta dirección:
>> >> [email protected]
>> >> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>> >
>> > --
>> > Para escribir al Grupo, hágalo a esta dirección:
>> > [email protected]
>> > Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>
>> --
>> Para escribir al Grupo, hágalo a esta dirección:
>> [email protected]
>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>
>
>

-- 
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano

Responder a