2010-07-07 15 views
6

Chúng tôi đang bắt đầu sử dụng NHibernate tại nơi làm việc của tôi, bao gồm tạo lược đồ từ ánh xạ. Một điều mà các DBA của chúng tôi muốn là tên phù hợp cho các mối quan hệ chính và khóa ngoại. Tôi đã có thể thiết lập tên hạn chế FK, nhưng nhìn vào tài liệu cho <id> nó không giống như có một cách để đặt tên cho ràng buộc khóa chính. http://www.nhforge.org/doc/nh/en/index.html#mapping-declaration-idNHibernate - Tên Hạn chế khóa chính?

Tôi cho rằng tôi đang thiếu thứ gì đó, vì điều này có vẻ như là một điều khá cơ bản cần làm.

Trả lời

5

Thật không may là nó không được hỗ trợ. Đây là một số ugly workaround.

+0

Hmm, hy vọng nó sẽ sớm được bổ sung. Chúng tôi đang sử dụng Fluent, vì vậy chúng tôi có thể chỉ cần tạo một tập lệnh riêng biệt, chúng tôi chạy tạo lược đồ bài đăng. Cảm ơn các liên kết! – Andy

+0

Liên kết hiện đã bị hỏng. Một ví dụ khác về nhận xét StackOverflow kém. –

+0

@FrancoisBotha Tôi xin lỗi vì đã không đáp ứng được kỳ vọng của bạn với câu trả lời này từ năm 2010. Tuy nhiên, một số tìm kiếm ánh sáng khiến tôi kết luận rằng điểm chính mà điều này không được hỗ trợ vẫn hợp lệ. –

4

Tôi chạy tập lệnh sau khi lược đồ được tạo để sửa các tên khóa chính. Thay thế $(targetDb) bằng tên cơ sở dữ liệu của bạn.

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

Từ http://www.primordialcode.com/blog/post/nhibernate-give-primary-key-schemaexport-sql-server-sql-express, đây là một cách giải quyết:

NHibernate không cung cấp (chưa) một cơ sở để đặt tên cho khóa chính của bạn (không có gì mà tôi tìm thấy tuy nhiên, tôi thừa nhận tôi 'm không phải là guru NHibernate, nhưng là người dùng trung bình). Bạn có thể sử dụng cách tiếp cận tương tự cho cách tiếp xúc trong bài đăng trước của tôi.

Trong ví dụ này, tôi đang sử dụng SQL Server/SQL Express làm công cụ cơ sở dữ liệu của mình và các truy vấn được xây dựng với ý nghĩ đó.

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

Với truy vấn này bạn sẽ có được tên thực tế của khóa chính đó là tạo ra bởi NHibernate, đây là đặc trưng cho SQL Server/SQL bày tỏ và được bạn sử dụng một cơ sở dữ liệu khác nhau mà bạn có để thích ứng với các truy vấn đó (Tôi biết bạn đã tách rời công cụ cơ sở dữ liệu do NHibernate cung cấp, nhưng bạn có thể thiết lập một số chiến lược để tải các ánh xạ khác nhau theo phương ngữ hiện tại của bạn).

Chúng tôi sử dụng quy trình được lưu trữ hệ thống cho phép chúng tôi đổi tên đối tượng mà chúng tôi nhận được trước đây.