Domanda

Supponi di mappare un oggetto semplice su una tabella che contiene record duplicati e voglio consentire duplicati nel mio codice. Non ho bisogno di aggiornare / inserire / eliminare su questa tabella, visualizzare solo i record.

Esiste un modo in cui posso inserire una colonna ID (generata) falsa nel mio file di mappatura per indurre NHibernate a pensare che le righe siano uniche? La creazione di una chiave composita non funzionerà perché potrebbero esserci duplicati su tutte le colonne.

Se ciò non è possibile, qual è il modo migliore per aggirare questo problema?

Grazie!

Modifica: la query sembrava essere la strada da percorrere

È stato utile?

Soluzione

La mappatura di NHibernate presuppone che desideri salvare le modifiche, quindi il requisito per un ID di qualche tipo.

Se ti è permesso modificare la tabella, puoi aggiungere una colonna di identità (denominazione di SQL Server - il tuo database potrebbe essere diverso) per generare automaticamente ID univoci - il codice esistente non dovrebbe essere interessato.

Se ti è permesso di aggiungere al database, ma non alla tabella, puoi provare a definire una vista che include una colonna sintetica (calcolata) RowNumber e usarla come origine dati da cui caricare. A seconda del fornitore del database (e della gestione dei prodotti di viste e indici) questo potrebbe affrontare alcuni problemi di prestazioni.

L'altra alternativa, che non ho provato, sarebbe quella di mappare la tua classe su una query SQL anziché su una tabella. IIRC, NHibernate supporta il nome di query SQL nel file di mapping e puoi utilizzarle come "origine dati" invece di una tabella o vista.

Altri suggerimenti

Se i tuoi dati vengono letti solo un modo semplice che abbiamo trovato è stato quello di racchiudere la query in una vista e costruire l'entità fuori dalla vista e aggiungere una colonna newguid (), il risultato è qualcosa di simile

SELEZIONA NEWGUID () come ID, * DA TABELLA

L'ID

diventa quindi la chiave primaria uniquer. Come indicato sopra, questo è utile solo per le visualizzazioni di sola lettura. Poiché l'ID non ha rilevanza dopo la query.

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