2010-01-03 5 views
1

Nhibernate를 사용하여 Mysql Db에서 ID 생성을위한 guid.comb 전략을 사용할 수 있습니까? 나는MySQL 데이터베이스에서 guid.comb 전략을 사용하는 방법

----> System.InvalidOperationException로 끝날

mapping.Id(x => x.Id) 
     .Column("row_guid") 
     .CustomType(typeof(string)) 
     .GeneratedBy.GuidComb() 
     .Length(36); 

내가로 사용

: 신원 유형이 GUID해야

인가 MySql 시나리오에서 이러한 장애물을 극복 할 수있는 방법이 있습니까?

편집 :
내가 GUID 및 INT사이에 선택의 여지가 없어. 이것은 MSSQL의 레거시 db 포트입니다

+0

로 지정? – Paco

+0

MySQL은 기본 GUID 저장소를 지원하지 않습니다. –

+0

숫자가 아니기 때문에 문자열 조회가 훨씬 느립니다. – Paco

답변

4

이것은 특히 MSSql 응용 프로그램을 MySql에 이식 할 때 일반적으로 발생하는 문제입니다.
David가 말했듯이 GuidCombGenerator 이상의 래퍼 인 간단한 CustomIdGenerator를 구현하여 Guid를 문자열로 제공합니다. 당신이 GUID를 저장하는 문자열 형식을 사용하는 이유는 무엇입니까

using NHibernate.Engine; 
using NHibernate.Id; 

namespace NHibernateMaps 
{ 
    public class GuidStringGenerator : IIdentifierGenerator 
    { 
    public object Generate(ISessionImplementor session, object obj) 
    { 
     return new GuidCombGenerator().Generate(session, obj).ToString(); 
    } 

    } 
} 

그리고 매핑

mapping.Id(x => x.Id) 
    .Column("row_id") 
    .CustomType(typeof(string)) 
    .GeneratedBy.Custom(typeof(GuidStringGenerator)) 
    .Length(36); 
+1

많은 행과 저장소 크기 및/또는 성능 문제가있는 경우 [Troels 'answer] (http://stackoverflow.com/questions/)에서 설명한대로 GUID를'BINARY (16) '열에 유지해야합니다. 1995579/how-do-i-use-guid-comb-strategy-in-a-mysql-db # 1995879) - 기본 키 인덱스의 단편화를 피하기위한 조치를 취하십시오. [MySQL에서 NHibernate guid.comb 기본 키를 사용할 때 단편화를 피하는 방법을 참조하십시오.] (http://stackoverflow.com/questions/11394305/how-to-avoid-fragmentation-when-using-nhibernate-guid-comb-primary -key-in-mysql/11394306)를 참조하십시오. –

2

기본 키에 지원되지 않는 데이터 유형을 사용하는 방법에 대한 확신이 없지만, 실제로 이것을 수행해야하는 경우 NHibernate 사용자를 작성할 수 있습니다 해당 속성을 Guid로 노출하지만 데이터베이스에 문자열로 지속되는 유형 이 경우 문제는 속성 자체가 guid.comb 전략에서 예상하는 System.Guid 이외의 데이터 유형으로 정의 된 것으로 보입니다.

오류가 계속 발생하지 않는다고 보장 할 수는 없지만 가능한 경우 작동하게하는 유일한 방법입니다. NHibernate 사용자 유형을 처음 접한다면 추상적 구현 클래스 인 here을 예제 구현 클래스와 함께 처리 할 수 ​​있습니다. 이 예제를 따라 할 수 있어야합니다.

+0

코드 샘플을 표시 할 수 있습니까? –

+0

도움이 될만한 링크가 올라있는 게시물을 편집하십시오. –

0

속성 유형으로 System.Guid을 (를) 사용할 수 있습니다.

O/RM은 매핑과 관련되어 있으므로 데이터베이스가 지정된 유형을 기본적으로 지원하지 않더라도 도메인 모델에서 계속 사용할 수 있습니다. MySQL의 호환성을 위해 기본 컬럼 유형은 BINARY(16)이어야합니다.

관련 문제