2012-09-07 17 views
9

Estoy trabajando con una base de datos existente, y tengo las siguientes tablas:NHibernate mapeo uno a muchos no en clave primaria

Person     ExternalFile 
------     ------------ 
Id   (int, PK) Key   (string) 
ConnectionId (int)  Type   (int) 
Name   (string) ConnectionId (int) 
Firstname (string) Path   (string) 
         Id   (int, PK) 

Un personal tiene muchos archivos externos.

ejemplo dado:

Person A    ExternalFile1   ExternalFile2 
--------    -------------   ------------- 
Id: 1     Key: 'WN'    Key: 'WN' 
ConnectionId: 29  Type: 4    Type: 4 
Name: 'Foo'    ConnectionId: 29  ConnectionId: 29 
Firstname: 'Bar'  Path: 'C:/file1.txt' Path: 'D:/file2.txt' 
         Id: 1     Id: 2 

¿Puedo asignar este modo que un usuario tiene una bolsa de ExternalFiles?

Mis MappingFiles

ExternalFile:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Not.Relative" assembly="Not"> 
    <class name="ExternalFile" table="tbl_externalfiles" lazy="false"> 
    <id name="Id" column="`Id`"> 
     <generator class="identity" /> 
    </id> 
    <property name="Key" column="`CDKey`" /> 
    <property name="ConnectionId" column="`KeyValue`" /> 
    <property name="Type" column="`DocType`" /> 
    <property name="Path" column="`Path`" /> 
    </class> 
</hibernate-mapping> 

Persona:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Not.Relative" assembly="Not"> 
    <class name="Person" table="tbl_person" lazy="false"> 
    <id name="Id" column="`Id`"> 
     <generator class="identity" /> 
    </id> 
    <property name="ConnectionId" column="`pairid`" /> 
    <property name="Name" column="`name`" /> 
    <property name="Firstname" column="`firstname`" /> 
    </class> 
</hibernate-mapping> 

Mi consulta se vería así:

SELECT * 
FROM tbl_externalfiles 
WHERE KeyValue = @p0 
AND CDKey = @p1 
AND DocType = @p2 

@p0 = 29, @p1 = 'WN', @p2 = 4 

así que tengo que dar 3 parámetros para la bolsa fr personas om a archivos externos,

1: el ID de conexión de la persona

2: 'WN' < - siempre el mismo (la clave)

3: 4 - < siempre el mismo (el tipo)

En muchos a uno esto funciona cuando hago un mapa para una identificación compuesta, pero no puedo usar eso en este caso.

¿Es posible una maleta aquí? ¿Debo simplemente utilizar una consulta adicional para buscar mis archivos externos donde utilizo un criterio para consultar?

EDIT:

sé que puedo hacer lo siguiente para sólo el ID de conexión

<bag name="Files" lazy="false"> 
    <key column="KeyValue" property-ref="ConnectionId"/> 
    <one-to-many class="ExternalFile" /> 
</bag> 

Pero no sé cómo obtener el tipo y los parámetros clave en allí también.

Gracias

Respuesta

13

probar este

<bag name="Files" lazy="false" where="DocType = '4' AND CDKey = 'WN'"> 
     <key column="KeyValue" property-ref="ConnectionId" /> 
     <one-to-many class="ExternalFile" /> 
    </bag> 
+0

funciona perfecto! Gracias. –

+0

¡Impresionante! No pensé en esto incluso. –

Cuestiones relacionadas