2010-09-03 13 views

Respuesta

3

Creo que hay un par de formas de hacer lo que intentas hacer.

El primero es especificar el nombre en el archivo de mapeo. Sé que funciona para claves externas, aunque no lo he intentado con claves únicas.

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

Dentro de NHibernate puede cambiar la estrategia de asignación de nombres mediante la creación de una clase que implementa NHibernate.Cfg.INamingStrategy y la adición de esa clase cuando se configura nhibernate.

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

También es una estrategia mejorada que está incorporada en nhibernate. No puedo recordar lo que da salida fuera de la mano, pero vale la pena intentarlo

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

EDITAR
Hay un par de otras posibilidades que he encontrado la primera de ellas consiste en la etiqueta de propiedad. hay una etiqueta de columna que tiene una serie de atributos que pueden ser de utilidad.

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

el otro es un poco más complicado Usted puede agregar algo como esto

<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 crear una clase que implementa NHibernate.Mapping.IAuxiliaryDatabaseObject que creará las sentencias DDL.
Tenga una mirada en el NHiberate manual on nhibernate.info y baje hasta

5,6. Objetos auxiliares de la base de datos

Esto explica lo que debe hacer.

+1

La primera forma no puede trabajar. Actualmente, el valor especificado de la clave única no se usa para nombrar la restricción, solo para agrupar las columnas en el archivo de asignación. Voy a probar el modo "NamingStrategy". – ldp615

+1

Y la forma de "NamingStrategy" tampoco puede funcionar. NHibernate.Cfg.INamingStrategy solo se ocupa de los nombres de tabla y columna. – ldp615

+0

Perdón por eso. Comprobaré si hay alguna otra forma de lograr lo que busca. –

1

Actualmente (todavía) no hay forma de hacerlo de forma nativa en NHibernate. He revisado el sistema de seguimiento de problemas y encontré un problema que se abrió en 2.0 y nunca se solucionó. He avanzado y descargué la fuente de NHibernate y pude solucionar este problema fácilmente. Construir el proyecto no es lo más fácil, pero una vez que lo tienes, no es tan malo. Publicaría el snippit de código aquí, pero es un poco grande para eso, así que si lo quieres, házmelo saber.

+0

¿por qué no crear una solicitud de extracción asociada al problema original? –

+0

Diego, estoy usando la versión 3.1 y la versión actual es 3.3, por lo que podría ser problemático. Además, todavía no estoy familiarizado con GitHub, ¿sería ese el curso de acción correcto? – Michael

+0

es probable que las piezas de código relacionadas con esto no hayan cambiado mucho (o no hayan cambiado) desde entonces. Además, puedes divertirte aprendiendo sobre Github y obtener solicitudes :-) Alternativamente, puedes publicar los cambios de código (con pruebas de unidad, si es posible) en el problema original o en la lista de desarrolladores. –

0

Después de hacer un SchemaExport que podría cambiar el nombre de todos los PK basado en el nombre de la tabla donde residen:

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 

vi hace años en: http://www.primordialcode.com/blog/post/nhibernate-give-primary-key-schemaexport-sql-server-sql-express

Cuestiones relacionadas