2012-01-24 10 views
8

Aquí está mi situación ..
Suponga que tiene las siguientes entidades modelo, que representan tablas individuales por sí mismos:

Películas [Movie_Id, Título, Clasificación, ..]
Actores [Actor_Id, nombre, apellido, ..]
director [Director_Id, nombre, Apellido, ..]

Y otra entidad/tabla llamada "Recomendaciones", que re presenta recomendaciones entre usuarios dentro de un sitio web. La idea es que una recomendación podría ser de cualquier tipo, es decir, alguien que recomiende a un actor o alguien que recomiende una película. Básicamente, la mesa debe ser algo como esto:

Recomendaciones [Recommendation_Id, OBJECT_ID, Object_Type, ..]

Y esto es lo que estoy atascado en. ¿Cómo puedo mapear estas relaciones en nHibernate con Fluent? Quiero decir ... mientras se hace la asignación, no puedo especificar el Tipo (qué tabla está relacionada con) porque eso está determinado en el tiempo de ejecución, pero no puedo confiar únicamente en el Id porque esto no puede implicar a qué tabla pertenece .
Por ejemplo, imagina este registro en la tabla de recomendaciones:

Recommendation_Id - OBJECT_ID - Object_Type
83001 a -401--- "M"

Básicamente estoy almacenar un identificador char (en este caso " M "representa la tabla" Películas ") para saber a qué tabla pertenece Object_Id. No puedo simplemente almacenar Object_Id sin Object_Type ..
Proyección en varios cuadros con Fluido NHibernate

Como comentario final, me gustaría añadir que he visto toda la tabla por clase, tabla por clase, tabla por clase de concreto ejemplos, pero creo que ninguno de estos ajustes en esta situación, como Movies_Id, Actors_Id, Directors_Id, ... son todos diferentes entre ellos, también lo es Recommendations_Id. Quiero decir, aquí no hay una herencia de clase clase-clase básica, no comparten Id's en absoluto ...

Espero ser claro. Gracias de antemano.

+0

Cabe señalar que la fluidez NHibernate no soporta actualmente muchos-a-cualquiera que sea lo que pensé que esto haría. A menos que me equivoque, guardar una recomendación cuando actualice una película no ocurrirá a la perfección.La respuesta de Daniel fue más parecida a cualquier otra cosa que pude encontrar; 0) – JasonCoder

+0

Si quieres mapear el otro lado de la relación 'any', como en' Movie.Recommendations', creo que podrías hacer esto con '' -to-many' y un atributo 'where =" Object_Type = 'M' "' en la colección, que puede hacer con Fluent NHibernate. –

Respuesta

11

El mapeo de NHibernate que está buscando es <any/>. Aquí hay algunos recursos para ayudarle a ponerse en marcha con esta función de mapeo de NHibernate:

creo que el * .hbm.xml que son disparar es algo como esto:

<class name="Recommendation" table="Recommendations"> 
    <id name="Id"> 
    <column name="Recommendation_Id" /> 
    <generator class="native"/> 
    </id> 

    <any name="RecommendedObject" id-type="System.Int32" meta-type="System.String"> 
    <meta-value value="M" class="Movie"/> 
    <meta-value value="A" class="Actor"/> 
    <meta-value value="D" class="Director"/> 
    <column name="Object_Type"/> 
    <column name="Object_Id"/> 
    </any> 

    <!-- other stuff ... --> 
</class> 

Usted debe ser capaz de lograr eso con Fluido NHibernate como tal en la cartografía de la Recomendación:

ReferencesAny(x => x.RecommendedObject) 
    .IdentityType<int>() 
    .EntityTypeColumn("Object_Type") 
    .EntityIdentifierColumn("Object_Id") 
    .AddMetaValue<Movie>("M") 
    .AddMetaValue<Actor>("A") 
    .AddMetaValue<Director>("D"); 
+0

GRACIAS MUCHO !!!! Lo probé y parece funcionar bien. En serio, un millón de gracias Daniel! : =) –

+0

¿Podría mostrar un ejemplo de cómo consultar sobre el 'objeto RecommendedObject' con el filtrado de' Object_Id'? –

+0

@Christian, ¿se refiere a http://stackoverflow.com/questions/21940396/fluentnhibernate-referencesany-how-to-use-queryover-with-filter? –

Cuestiones relacionadas