2017-02-10 4 views
1

질문
동일한 .hbm 구성으로 사전 컬렉션 교차 데이터베이스를 매핑하는 방법은 무엇입니까?기본 키가없는 NHibernate 사전 매핑

시나리오 I은 사전 특성에 매핑하는 것을 시도하고있다
:

Dictionary<string, string> Phrases { set; get; } 

다음 .hbm 구성 :

<map 
    name="Phrases" 
    cascade="save-update" 
    table="ATTRIBUTE_LOCALE" 
    lazy="true"> 
     <key column="RESOURCE_ID" /> <!-- foreign key --> 
     <index column="LOCALE_NAME" type="string" /> 
     <element column="PHRASE" type="string" /> 
</map> 

을 다음과 같은 테이블이 [ATTRIBUTE_LOCALE의 SQL을 만드는 것입니다 ] MS SQL 용 :

CREATE TABLE ATTRIBUTE_LOCALE ( 
    CUID int IDENTITY(1, 1) NOT NULL, 
    RESOURCE_ID int NOT NULL, 
    FIELD_NAME nvarchar(255) DEFAULT 'VALUE' NOT NULL, 
    LOCALE_NAME nvarchar(255) NOT NULL, 
    PHRASE ntext NULL 
); 

하지만 데이터베이스를 MS SQL Server에서 Oracle 및 Oracle 데이터베이스로 변경하면 IDENTITY (1, 1)을 사용하여 기본 키를 자동으로 생성 할 수 없습니다. 오라클에서는 NULL 기본 키가있는 테이블 삽입으로 인해 문제가 발생합니다.

이 문제를 어떻게 해결할 수 있습니까?

답변

0

동료는 테이블 스키마를 조정할 것을 권장합니다.

  1. 제거 열 CUIDFIELD_NAME
  2. RESOURCE_IDLOCALE_NAME복합 키하자.
  3. RESOURCE_ID을 복합 키로 사용하고 외래 키을 동시에 사용하십시오.

실제로 위의 방법으로 내 문제를 해결할 수 있지만이 데이터 스키마 디자인이 좋지 않습니까.

누군가이 데이터 스키마 디자인에 대한 조언을 주시면 감사하겠습니다.

2

당신은 identity보다는 native 발전기로 ATTRIBUTE_LOCALE 테이블을 매핑 할 수 있습니다 :

크로스 플랫폼 개발을위한

, 기본 전략은, identity, sequence, hilo 방도에서의 기능에 의존 선택합니다 기본 데이터베이스 (ref).

오라클은 신원 열 개념을 지원하지 않습니다. SQL Server 2012 이상을 사용하는 경우 ID가 아닌 시퀀스를 사용할 수 있습니다. 이는 오라클과보다 일관성이 있으며 오히려 ORM 방식의 더 나은 키 생성 전략입니다.

+0

내 요구 사항에서 ATTRIBUTE_LOCALE은 사전 속성을 매핑해야합니다. ATTRIBUTE_LOCALE에 .hbm 및 도메인을 추가 할 수 없습니다. 또한, .hbm 구성에 포함 된 에는 원시 생성자를 사용하여 oracle의 기본 키를 처리했습니다. –