2012-01-24 20 views
8

Ecco la mia situazione ..
Supponiamo di avere le seguenti entità del modello, che rappresentano tavoli singoli per conto proprio:

Film [Movie_Id, Titolo, Valutazione, ..]
Attori [Actor_Id, nome, cognome, ..]
Direttore [Director_Id, nome, Cognome, ..]

E un'altra entità/tabella denominata "Raccomandazioni", che ri presenta raccomandazioni tra gli utenti all'interno di un sito web. L'idea è che una raccomandazione potrebbe essere di qualsiasi tipo, ad esempio qualcuno che raccomanda un attore o qualcuno che raccomanda un film. In sostanza, la tabella dovrebbe essere simile a questa:

Raccomandazioni [Recommendation_Id, object_id, Tipo_Oggetto, ..]

Ed ecco quello che sono bloccato in. Come posso mappare queste relazioni in NHibernate con Fluent? Intendo .. durante la mappatura, non posso specificare il tipo (a quale tabella si riferisce) perché è determinato in fase di esecuzione, ma non posso fare affidamento solo sull'Id 'causa di per sé non può implicare a quale tabella appartiene .
Per esempio, immaginate questo record sulla tabella Raccomandazioni:

Recommendation_Id - OBJECT_ID - Tipo_Oggetto
83001--401--- "M"

Fondamentalmente sto memorizzare un identificatore char (in questo caso " M "sta per tabella" Movies ") per sapere a quale tabella appartiene Object_Id. Non riesco a memorizzare Object_Id senza Object_Type ..
Mapping di più tabelle con Fluent NHibernate

Come commenti finali, vorrei aggiungere che ho visto tutto il table-per-class, table-per-subclass, table-per-concrete-class esempi, ma credo che nessuno di questi si adatti a questa situazione, poiché Movies_Id, Actors_Id, Directors_Id, ... sono tutti diversi tra loro, quindi è Recommendations_Id. Voglio dire, non esiste un'eredità di classe classe-figlio di base qui, non condividono affatto l'ID.

Spero di essere chiaro. Grazie in anticipo.

+0

Va notato che fluente NHibernate non supporta attualmente molti-to-any che è quello che ho pensato che questo avrebbe fatto. A meno che non mi sbagli, il salvataggio di un consiglio quando aggiorni un film non avverrà senza problemi.La risposta di Daniel era più vicina a qualsiasi altra cosa potessi trovare; o) – JasonCoder

+0

Se vuoi mappare l'altro lato della relazione 'any', come in" Movie.Raccomandations ", credo che potresti farlo con un' -to-many' e un attributo 'where =" Object_Type = 'M' "' sulla raccolta, che puoi fare con Fluent NHibernate. –

risposta

11

La mappa di NHibernate che stai cercando è <any/>. Qui ci sono alcune risorse per aiutarvi a ottenere fino a velocità con questa caratteristica mappatura NHibernate:

Credo che il * .hbm.xml che siete sparare per è qualcosa di simile:

<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> 

Si dovrebbe essere in grado di realizzare che, con Fluent NHibernate in questo modo nella mappatura di Raccomandazione:

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

GRAZIE MOLTO !!!! L'ho provato e sembra funzionare bene. Seriamente, un milione ringrazia Daniel! : =) –

+0

Puoi per favore mostrare un esempio su come eseguire una query su 'Oggetto RecommendedObject' con il filtro per' Object_Id'? –

+0

@Christian, ti stai riferendo a http://stackoverflow.com/questions/21940396/fluentnhibernate-referencesany-how-to-use-queryover-with-filter? –

Problemi correlati