2009-05-05 19 views
8

Sto tentando di creare una mappatura a una tabella di database che non ha chiavi/riferimenti primari.Mappatura tabella Fluent-NHibernate senza chiave primaria

public class TestMap : ClassMap<<Test>Test> { 

    public TestMap() { 

     WithTable("TestTable"); 

     Map(x => x.TestColumn); 

    } 

} 

Questo fallisce e si aspetta id o ID composito. Questo è possibile in fluente Nibernetico?

+0

C'è una chiave primaria 'non contrassegnata' - cioè una raccolta di campi crea una chiave primaria, ma la tabella non ha una chiave primaria definita? –

risposta

2

No. Per associare questa tabella è necessario aggiungere una chiave primaria surrogata, ad esempio una colonna Identity in SQL Server. Per quanto ne so, questo non è supportato da NHibernate stesso.

Perché non hai una chiave primaria su questo tavolo?

+5

Vorrei anche una risposta a questa domanda. A volte (in realtà la maggior parte delle volte) non stiamo lavorando in scenari greenfield. Stiamo invece creando un nuovo DAL NHibernate fluido su uno schema db esistente che non può essere modificato. Ho una tabella senza una colonna Identity e chiavi ben rifinite. Credimi, se potessi cambiare questo schema, lo faremmo, ma abbiamo il requisito di non modificare lo schema del database. –

4

In Oracle almeno, ho usato "ROWID" per questo. Per mssql è possibile utilizzare la funzione incorporata "ROW_NUMBER()" per l'accesso in lettura alla tabella, ma non l'ho provato ...

+0

Che glorioso piccolo hack. Ho appena provato a mappare una colonna ID a ROWID e NHibernate non sembra avere alcun problema. GRAZIE! – rie819

0

Questa funzionalità non è supportata da nhibernate per quanto ne so. Come regola generale, tuttavia, dovresti sempre avere una sorta di ID e se ti trovi in ​​una situazione in cui pensi di non averne bisogno, dovresti valutare il tuo modello di dati. Dovrebbe esistere un ID, che si tratti di una chiave primaria specifica della tabella o di una chiave surrogata di un'altra tabella. Ciò non solo garantisce che nhibernate possa elaborare la tabella, ma aiuta la performance tramite l'indicizzazione.

Prima di iniziare a pensare che il nibernario non soddisfi le tue esigenze, considera perché non hai una chiave sul tavolo e che senso ha che non ne ha una.

0

Se siamo in grado di portare una colonna dalla tabella di non avere coulmn chiave primaria/identità, allora possiamo usare fluente come di seguito:

Id(x => x.TempID).Column("TempID"); 
0

Se la tabella contiene dati che appartiene ad un altro soggetto, si potrebbe mappare come una raccolta di componenti . I componenti non sono identificati da soli, ma appartengono ad un'altra entità, identificata da .

0

È possibile associare un'entità a una tabella senza le chiavi definite nel database. Lo faccio nei database SQL Server legacy. Tuttavia, la tabella deve avere una chiave candidata (un insieme di colonne che in realtà memorizza una combinazione univoca di valori). Il concetto di entità riguarda la nozione di un tipo di identità . Invece di ciò, quello che stai provando nel tuo codice è mappare un'entità senza identità, che non è possibile.

Problemi correlati