2010-09-03 19 views

Répondre

3

Je pense qu'il y a plusieurs façons de faire ce que vous essayez de faire.

La première consiste à spécifier le nom dans le fichier de mappage. Je sais que cela fonctionne pour les clés étrangères, même si je n'ai pas essayé avec des clés uniques.

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

Dans NHibernate vous pouvez modifier la stratégie d'attribution de noms en créant une classe qui implémente NHibernate.Cfg.INamingStrategy et en ajoutant cette classe lorsque vous configurez NHibernate.

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

Le est également un ImprovedNamingStrategy qui est intégré à nhibernate. Ne me souviens pas ce qu'il génère de la main, mais la peine d'essayer

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

EDIT
Il y a deux autres possibilités que j'ai trouvé la première implique la balise de propriété. il y a une balise de colonne qui a un certain nombre d'attributs qui peuvent être utiles.

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

l'autre est un peu plus impliqué Vous pouvez ajouter quelque chose comme ça

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

Ou créer une classe qui implémente NHibernate.Mapping.IAuxiliaryDatabaseObject qui va créer les instructions DDL.
Jetez un oeil dans la NHiberate manual on nhibernate.info et faites défiler jusqu'à

5,6. Objets de base de données auxiliaires

Ceci explique ce que vous devez faire.

+1

La première ne peut pas fonctionner. Actuellement, la valeur spécifiée de la clé unique n'est pas utilisée pour nommer la contrainte, uniquement pour regrouper les colonnes dans le fichier de mappage. Je vais essayer "NamingStrategy" manière. – ldp615

+1

Et la méthode "NamingStrategy" ne peut pas non plus fonctionner. NHibernate.Cfg.INamingStrategy se soucie uniquement des noms de tables et des noms de colonnes. – ldp615

+0

Désolé pour ça. Je vais vérifier s'il existe un autre moyen d'accomplir ce que vous recherchez. –

1

Actuellement, il n'y a pas (encore) de moyen de le faire nativement dans NHibernate. J'ai parcouru le système de suivi des problèmes et j'ai trouvé un problème qui a été ouvert en 2.0 et jamais corrigé. Je suis allé de l'avant et téléchargé la source pour NHibernate et a été facilement capable de résoudre ce problème. Construire le projet n'est pas le plus facile mais une fois que vous l'avez, ce n'est pas si mal. Je posterais le code ici, mais c'est un peu gros pour ça, donc si vous le voulez, faites le moi savoir.

+0

pourquoi ne pas créer une requête de tirage associée au problème d'origine? –

+0

Diego, j'utilise la version 3.1 et la version actuelle est 3.3, ce qui pourrait poser problème. De plus, je ne suis pas encore familier avec GitHub, est-ce que ce serait le bon plan d'action? – Michael

+0

il est probable que les parties de code liées à cela n'ont pas beaucoup changé (ou pas du tout) depuis lors. De plus, vous pouvez vous amuser à apprendre sur Github et à tirer des requêtes :-) Vous pouvez également poster vos modifications de code (avec des tests unitaires si possible) dans le problème original ou dans la liste de dev. –

0

Après avoir fait un SchemaExport vous pouvez renommer tous les PK basée sur le nom de la table où ils résident:

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 

il y a quelques années à Saw: http://www.primordialcode.com/blog/post/nhibernate-give-primary-key-schemaexport-sql-server-sql-express