Domanda

Mi trovo nella situazione in cui utilizzo un software GIS che memorizza le informazioni sugli oggetti GIS in una tabella di database separata per ogni tipo/classe di oggetto GIS (strada, fiume, edificio, mare, ...) e mantiene la tabella dei metadati in cui memorizza informazioni sul nome della classe e sulla relativa tabella DB.

Quegli oggetti GIS di classi diverse condividono alcuni parametri, ad es.Descrizione e ID.Mi piacerebbe rappresentare tutte queste diverse classi GIS con una classe C# comune (chiamiamola GisObject), che è sufficiente per quello che devo fare dalla parte non GIS dell'applicazione che elenca gli oggetti GIS del dato GIS classe.

Il problema per me è come mappare quegli oggetti usando NHibernate per spiegare a NHibernate quando si crea un GisObject C# per ricevere e utilizzare il nome della tabella come parametro che verrà letto dalla meta tabella (può essere in due passaggi, posso recuperare manualmente il nome della tabella nel primo passaggio e quindi trasmetterlo a NHibernate quando estraggo i dati GisObject).

Qualcuno ha affrontato questo tipo di situazione ed è possibile farlo?

È stato utile?

Soluzione 2

@Brian Chiasson

Sfortunatamente, non è possibile creare tutte le classi di dati GIS poiché le classi vengono create dinamicamente nell'applicazione.Tutti i dati GIS dello stesso tipo dovrebbero essere una classe, ma il mio utente ha la possibilità di ottenere un nuovo set di dati e inserirlo nel database.Non posso sapere di fronte quali classi avrà il mio utente nell'applicazione.Pertanto, il modello di mappatura per classe in primo piano non funziona perché domani ci sarà un'altra nuova tabella del database e sarà necessario creare una nuova classe con una nuova mappatura.

@All potrebbe esserci la possibilità di scrivere la mia query personalizzata nel file di configurazione XML della mia classe GisObject, quindi nella classe di accesso ai dati che prendono quella query usando il

string qs = getSession().getNamedQuery(queryName);

e usa la stringa replace per inserire il nome del database (sostituendo una stringa segnaposto) che passerò come parametro.

qs = qs.replace(":tablename:", tableName);

Come ti senti rispetto a questa soluzione?So che potrebbe essere un rischio per la sicurezza in un ambiente non controllato in cui il nome della tabella verrebbe recuperato come input dell'utente, ma in questo caso ho una metatabella contenente nomi di tabella corretti e validi per le classi di dati GIS che leggerò prima chiamando la query per recuperare i dati per la classe specifica di oggetti GIS.

Altri suggerimenti

Sembra che la cosa più semplice da fare qui potrebbe essere quella di creare una classe base astratta con tutti i membri GIS comuni e quindi ereditare le altre classi X che non avranno altro che le necessarie mappature NHibernate.Utilizzerei quindi il pattern Factory per creare l'oggetto del tipo specifico utilizzando i metadati.

un modo per farlo è dichiarare un'interfaccia, ad esempio IGisObject, che abbia le proprietà comuni dichiarate sull'interfaccia.Quindi implementa una classe concreta che si associa a ciascuna tabella.In questo modo saranno comunque tutti di tipo IGisObject.

Puoi dare un'occhiata a cosa sta dicendo Ayende qui: Entità multitabella.

Ma dal momento che hai tabelle separate, non penso che funzionerà.Puoi anche controllare gruppo nhuser

Immagino che porrei la domanda sul motivo per cui stai cercando i dati GIS direttamente nel database e non utilizzi l'API che in genere viene fornita come astrazione per te.Se si tratta di un sistema ESRI, esistono strumenti che consentono di creare visualizzazioni di database statiche nei propri oggetti GIS e quindi forse da quel punto potrebbe essere appropriato per l'estrazione dei dati.

Dalla documentazione di NHibernate, potresti utilizzare uno dei file mappature di ereditarietà.

Potresti anche avere una classe separata per ogni tabella, ma fare in modo che tutte implementino un'interfaccia comune

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top