2010-07-07 15 views
6

Estamos empezando a utilizar NHibernate en mi lugar de trabajo, incluida la generación del esquema a partir de las asignaciones. Una cosa que nuestros administradores de bases de datos desean es nombres consistentes para las relaciones de clave principal y externa. Pude configurar el nombre de la restricción FK, pero al mirar la documentación para <id>, no parece que haya una forma de nombrar la restricción de la clave primaria. http://www.nhforge.org/doc/nh/en/index.html#mapping-declaration-idNHibernate - Nombre ¿Restricción de clave primaria?

Supongo que me falta algo, ya que parece una cosa bastante básica.

Respuesta

5

Desafortunadamente no es compatible. Aquí hay un ugly workaround.

+0

Hmm, con suerte, se agregará pronto. Estamos utilizando Fluent, por lo que probablemente solo crearemos un script separado para ejecutar la creación de esquema posterior. Gracias por el enlace! – Andy

+0

El enlace ahora está roto. Otro ejemplo de un comentario pobre de StackOverflow. –

+0

@FrancoisBotha Me disculpo por no cumplir con sus expectativas con esta respuesta de 2010. Sin embargo, algunas búsquedas ligeras me llevan a la conclusión de que el punto principal de que esto no es compatible sigue siendo válido. –

4

Ejecuto el siguiente script después de que se genera el esquema para corregir los nombres de las claves principales. Reemplace $(targetDb) con el nombre de su base de datos.

BEGIN TRANSACTION 
DECLARE @Rename nvarchar(MAX) 
DECLARE RenameCursor CURSOR FOR 
    SELECT 
      'EXEC sp_rename ''[' + c.CONSTRAINT_SCHEMA + '].[' + c.CONSTRAINT_NAME + ']'', ''PK_' + c.TABLE_NAME + ''', ''OBJECT''' 
     FROM $(targetDb).INFORMATION_SCHEMA.TABLE_CONSTRAINTS c 
     WHERE 
      c.CONSTRAINT_TYPE = 'PRIMARY KEY' 
      AND 
      c.TABLE_NAME IS NOT NULL 
     ORDER BY c.TABLE_NAME 
OPEN RenameCursor 
FETCH NEXT 
    FROM RenameCursor 
    INTO @Rename 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    EXEC sp_executesql @Rename 
    FETCH NEXT 
     FROM RenameCursor 
     INTO @Rename 
END 
CLOSE RenameCursor 
DEALLOCATE RenameCursor 
COMMIT TRANSACTION 
0

De http://www.primordialcode.com/blog/post/nhibernate-give-primary-key-schemaexport-sql-server-sql-express, aquí es una solución:

NHibernate no ofrece (todavía) una instalación para dar un nombre a la clave principal (nada de lo que he encontrado, sin embargo, admito que me no soy un gurú de NHibernate, sino un usuario promedio). Puede utilizar un enfoque similar al expuesto en mi publicación anterior.

En este ejemplo estoy usando SQL Server/SQL Express como mi motor de base de datos y las consultas se crean con eso en mente.

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"> 
    <class name="SID.Sphera.Controls.Extended.ImageRegion.Entities.ImageSheetData, SID.Sphera.Controls.Extended" 
    table="ImageRegionImageSheetData" lazy="false"> 
     <id name="_Id" access="field" column="IRISD_Id" type="guid"> 
      <generator class="guid" /> 
     </id> 
     <property name="_Name" access="field" column="IRISD_Name" type="string" not-null="true" /> 
     <property name="_ResourceId" access="field" column="IRISD_ResourceId" type="guid" not-null="true" /> 
     <property name="_Width" access="field" column="IRISD_Width" not-null="true" type="int" /> 
     <property name="_Height" access="field" column="IRISD_Height" not-null="true" type="int" /> 
     <property name="_BackgroundImageId" access="field" column="IRISD_BackgroundImageId" type="guid" 
     not-null="false" /> 
     <bag name="_sensitiveRegions" access="field" cascade="all-delete-orphan" lazy="false"> 
      <key column="IRIRD_ParentImageSheetId" foreign-key="FK_IRIRD_IRISD" /> 
      <one-to-many class="SID.Sphera.Controls.Extended.ImageRegion.Entities.ImageRegionData, SID.Sphera.Controls.Extended" /> 
     </bag> 
    </class> 
    <!-- Primary Key Rename --> 
    <database-object> 
     <create> 
     DECLARE @pkName Varchar(255) 
     ; 
     SET @pkName= (
      SELECT [name] FROM sysobjects 
      WHERE [xtype] = 'PK' 
      AND [parent_obj] = OBJECT_ID(N'[dbo].[ImageRegionImageSheetData]') 
     ) 
     ; 
     Exec sp_rename @pkName, 'PK_ImageRegionImageSheetData', 'OBJECT' 
     </create> 
     <drop/> 
    </database-object> 
</hibernate-mapping> 

Con esta consulta se obtiene el nombre real de la clave principal que era generada por NHibernate, esto es específico a SQL Server/SQL Express y se le utiliza un motor de base de datos diferente que tiene para adaptar esas consultas (sé que pierdes el desacoplamiento al motor de base de datos ofrecido por NHibernate, pero puedes configurar algunas estrategias para cargar diferentes asignaciones de acuerdo con tu dialecto actual).

Utilizamos un procedimiento almacenado en el sistema que nos permite renombrar el objeto que obtuvimos antes.

Cuestiones relacionadas