El mapeo de la propiedad de índice no funciona

Tengo este problema:

Supongamos que tengo un Usuario, y el suyo es propiedad de Tarjetas:

public class User: Entity
{
...
public virtual IList<Card> Cards { get; set; }
...
}

<class name="User" table="Users">
    <id name="Id" column="UserId">
      <generator class="guid"/>
    </id>
    <version name="Version"/>
    ...
    <list name="Cards" cascade="all" inverse="true">
      <key column="ViolatorId" not-null="true"/>
      <index column="CardIndex"/>
      <one-to-many class="Card"/>
    </list>
    ...
</class>

Luego obtengo el usuario de la base de datos, lo agrego a la lista de tarjetas una tarjeta y llamo a session.Update ().

Generado este código sql:

INSERT INTO Cards
            (Version,
             ViolatorId,
             ModeratorId,
             IssueDate,
             TermDate,
             Cause,
             Type,
             CardId)
VALUES      (1 /* @p0_0 */,
             '6872df65-a1d7-40ef-abec-c14af96f3388' /* @p1_0 */,
             '06060a30-252a-4f29-84fe-af5da110f049' /* @p2_0 */,
             '2011-11-06T17:20:11.00' /* @p3_0 */,
             '2011-11-06T22:20:11.00' /* @p4_0 */,
             'Ad personam' /* @p5_0 */,
             'Red' /* @p6_0 */,
             '0454bbba-5ec9-429f-8830-d9cc33588f7a' /* @p7_0 */)

El problema es que la solicitud no contiene el valor de CardIndex y lo llena en la base de datos como NULL.

¿Cómo hacer que NHibernate funcione correctamente?

preguntado el 06 de noviembre de 11 a las 14:11

Por supuesto, puedo usar Bag en este caso, pero en el proyecto tengo ejemplos similares. -

1 Respuestas

He utilizado el mapeo Fluent NHibernate para definir mapeos de entidades. En su caso, tiene una relación de uno a muchos entre la entidad Usuarios y Tarjetas. Para que el guardado / actualización / eliminación en cascada funcione correctamente, deberá definir dos mapeos adecuados entre las dos entidades. Además, la entidad Tarjetas debe tener una referencia a la entidad Usuarios. Consulte el siguiente enlace para ver cómo se define este tipo de mapeo (en C #) usando Fluent NHibernate:

http://wiki.fluentnhibernate.org/Fluent_mapping#HasMany_.2F_one-to-many http://wiki.fluentnhibernate.org/Fluent_mapping#References_.2F_many-to-one

Aunque el código se proporciona en C #, supongo que no debería ser muy difícil para usted entender qué está pasando.

También puede probar el siguiente enfoque para el tipo de entidades de relación padre-hijo que guardan en cascada.

public void Test()
{
    using (IStatelessSession statelessSession = _sessionManager.OpenStatelessSession())
    {
        using (ITransaction transaction = statelessSession.BeginTransaction())
        {
            statelessSession.Insert(<ParentEntity>);
            foreach(var childEntity in ParentEntity)
            {
                statelessSession.Insert(<childEntity>);
            }
            transaction.Commit();
        }       
    }
}

Pero nuevamente, para que esto funcione correctamente, su mapeo debe estar claramente definido.

respondido 06 nov., 11:19

Fluent es agradable, pero ahora totalmente en movimiento o hacer un lío en el proyecto que no quiero. Pero de todos modos gracias por la ayuda. - Kovpaev Alexey

Utilizo Fluent NHibernate, así que lo usé como un medio para compartir mis conocimientos. La idea de mapeo es realmente la misma y en tiempo de ejecución (no estoy seguro si es tiempo de ejecución o tiempo de compilación), el SQL generado será exactamente el mismo. - Pawan Mishra

Entiendo esto, solo quiero saber qué estoy haciendo mal. ¿Quizás me falta algún atributo? - Kovpaev Alexey

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.