2010-09-03 11 views

risposta

3

Penso che ci siano un paio di modi per fare ciò che stai cercando di fare.

Il primo è specificare il nome nel file di mapping. So che funziona per le chiavi esterne, anche se non ho provato con le chiavi univoche.

<property name="KeyId" column="KeyId" type="Int" unique="true" unique-key="MyKeyName"/> 

All'interno NHibernate è possibile modificare la strategia di denominazione con la creazione di una classe che implementa NHibernate.Cfg.INamingStrategy e l'aggiunta di quella classe quando si configura NHibernate.

ISessionFactory sf = new Configuration() 
    .SetNamingStrategy(new YourNamingStrategy()) 
    .Configure() 
    .SchemaExport(true, false); 

È anche una categoria di programmazione migliorata incorporata per la protezione. Non ricordo che cosa uscite fuori mano, ma vale la pena provare

ISessionFactory sf = new Configuration() 
    .SetNamingStrategy(ImprovedNamingStrategy.Instance) 
    .Configure() 
    .SchemaExport(true, false); 

EDIT
Ci sono un paio di altre possibilità che ho trovato il primo riguarda il tag di proprietà. c'è un tag colonna che ha un numero di attributi che possono essere utili.

<property name=KeyID> 
    <column name="KeyId" unique-key="MyKeyName"/> 
</property> 

l'altro è un po 'più coinvolti è possibile aggiungere qualcosa di simile

<database-object > 
    <create> 
     create table MyTable(
     Id UNIQUEIDENTIFIER not null, 
     Name NVARCHAR(10) not null, 
     RowVersion INT not null, 

     primary key (Id) 
    ) 

ALTER TABLE dbo.MyTable ADD 
    CONSTRAINT IX_Table_1 UNIQUE NONCLUSTERED(Name) 
    WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
    ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
    </create> 
    <drop></drop> 
</database-object> 

O creare una classe che implementi NHibernate.Mapping.IAuxiliaryDatabaseObject che creerà le istruzioni DDL.
Date un'occhiata nel NHiberate manual on nhibernate.info e scorrere verso il basso per

5,6. Oggetti di database ausiliari

Questo spiega cosa è necessario fare.

+1

Il primo modo non può funzionare. Attualmente, il valore specificato della chiave univoca non viene utilizzato per assegnare un nome al vincolo, ma solo per raggruppare le colonne nel file di mapping. Proverò la modalità "NamingStrategy". – ldp615

+1

Anche la modalità "NamingStrategy" non può funzionare. NHibernate.Cfg.INamingStrategy si occupa solo dei nomi delle tabelle e dei nomi delle colonne. – ldp615

+0

Mi dispiace per quello. Controllerò per vedere se c'è un altro modo per ottenere ciò che stai cercando. –

1

Attualmente non esiste (ancora) un modo per farlo in modo nativo in NHibernate. Ho esaminato il sistema di rilevamento dei problemi e ho trovato un problema che è stato aperto in 2.0 e non è mai stato risolto. Sono andato avanti e ho scaricato la fonte per NHibernate ed è stato facilmente in grado di risolvere questo problema. Costruire il progetto non è il più facile ma una volta capito, non è poi così male. Pubblicherei il codice snippit qui, ma è un po 'grande per quello, quindi se lo vuoi fammelo sapere.

+0

perché non creare una richiesta di pull associata al problema originale? –

+0

Diego, sto usando la versione 3.1 e la versione corrente è la 3.3, quindi potrebbe essere problematica. Inoltre, non sono ancora così familiare a GitHub, sarebbe la giusta linea d'azione? – Michael

+0

è probabile che le parti di codice relative a questo non siano cambiate molto (o del tutto) da allora. Inoltre, puoi divertirti imparando a conoscere Github e richiamare le richieste :-) In alternativa, puoi semplicemente postare le modifiche al codice (con i test delle unità, se possibile) nel numero originale o nella lista degli sviluppatori. –

0

Dopo aver fatto una SchemaExport si potrebbe rinominare tutti PK in base al nome della tabella in cui risiedono:

DECLARE @PKname nvarchar(255), @TName nvarchar(255), @TName2 nvarchar(258) DECLARE PKCursor CURSOR FOR SELECT PK.name, T.name AS Tname FROM sys.sysobjects AS PK INNER JOIN sys.sysobjects AS T ON PK.parent_obj = T.id WHERE (PK.xtype = 'PK') OPEN PKCursor FETCH NEXT FROM PKCursor INTO @PKname, @TName WHILE @@FETCH_STATUS = 0 BEGIN SET @TName2 = 'PK_' + @TName PRINT 'table ' + @TName + ' : renaming ' + @PKname + ' in ' + @TName2 Exec sp_rename @PKname, @TName2, 'OBJECT' FETCH NEXT FROM PKCursor INTO @PKname, @TName END CLOSE PKCursor DEALLOCATE PKCursor 

lo vide anni fa a: http://www.primordialcode.com/blog/post/nhibernate-give-primary-key-schemaexport-sql-server-sql-express

Problemi correlati