2010-02-26 3 views
12

의 "VARCHAR"의 SQL 유형으로 그러나설정 문자열 대신 나는 다음과 같은 매핑 한 "NVARCHAR"

public class LogEntryMap 
{ 
    public LogEntryMap() 
    { 
     Map.Id(x => x.Id).GeneratedBy.Identity(); 
     Map(x => x.Context).CustomSqlType("varchar").Length(512); 
    } 
} 

, SQL Server 2008의 데이터베이스를 생성하는 SchemaExport를 사용하여 스크립트를 생성 길이를 무시 그래서 효과는 (1)의 길이가되는 varchar 끝낸다 :

create table OV_SAC.dbo.[LogEntry] (
    Id BIGINT IDENTITY NOT NULL, 
    Context varchar null, 
    primary key (Id) 
) 

.CustomSqlType("varchar 512") 예외를 던진다. 그리고 CustomSqlType을 정의하지 않으면 문자열이 nvarchar (Length 속성을 참조)으로 매핑됩니다.

제안 사항?

답변

22

사용 .CustomType("AnsiString") 대신 기본 "String"과 NHibernate에의 varchar 대신 nvarchar 사용합니다.

8

도.

Map(x => x.Context).CustomSqlType("varchar (512)"); 

create table OV_SAC.dbo.[LogEntry] (
    Id BIGINT IDENTITY NOT NULL, 
    Context varchar (512) null, 
    primary key (Id) 
) 
16

당신은 을 원하는 경우 문자열의는 당신이 규칙을 사용하여 고려할 수 대신 NVARCHAR의 VARCHAR에 매핑 할 수있는 모든 :

/// <summary> 
/// Ensures that all of our strings are stored as varchar instead of nvarchar. 
/// </summary> 
public class OurStringPropertyConvention : IPropertyConvention 
{ 
    public void Apply(IPropertyInstance instance) 
    { 
     if (instance.Property.PropertyType == typeof (string)) 
      instance.CustomType("AnsiString"); 
    } 
} 

당신의 매핑은 다음 간단한지도로 돌아갈 수 :

Map(x => x.Context); 

Fluent NH에 규칙을 사용하는 것을 잊지 마십시오.

 var configuration = new Configuration(); 
     configuration.Configure(); 
     Fluently 
      .Configure(configuration) 
      .Mappings(m => m.FluentMappings 
       .AddFromAssemblyOf<Widget>() 
       .Conventions.Add<OurStringPropertyConvention>() 
       ) 
      .BuildSessionFactory(); 
+0

위대한 !! 이제 모든 속성을 varchar로 지정하려면 어떻게해야합니까? 규칙에 따라 덮어 쓰지 않고 매핑의 해당 엔터티에 대한 CustomType을 재정의 할 수 있습니까? –

+0

@GerardoGrignoli : 가능합니다. 협약은 기본값 만 설정합니다. ansi-string 규칙을 사용하고 특정 열 매핑을 '.CustomType '으로 설정하면 예상대로 작동합니다. – quetzalcoatl

0

"CustomType ("AnsiString ")"옵션을 사용하면 nvarchar를 사용할 수 없지만 varchar (30)로 지정된 열의 필드 길이를 8000으로 설정 한 것으로 나타났습니다. 8000 varchar는 4000 nvarchar보다 훨씬 빠르지 만 여전히 SQL Server 오버 헤드에 큰 문제를 일으 킵니다.

+1

그래서 해봤 : Map (x => x.Context) .CustomSqlType ("varchar (30)"); – Ted

관련 문제