2010-02-26 7 views
12

ait "varchar" nin sql tipi olmak: AncakAyar dize yerine aşağıdaki eşleme var "nvarchar"

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

, SQL Server 2008 veritabanını oluşturmak için SchemaExport kullanarak, komut dosyası oluşturulur uzunluğunu dikkate almaz böylece etkin olarak 1 uzunluğu ile varchar biter:

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

.CustomSqlType("varchar 512") bir durum oluşturur. Ve CustomSqlType'u tanımlamadan, dizeler nvarchar (Length özelliğine saygı duyar) ile eşlenir.

Herhangi bir öneriniz var mı?

cevap

22

Kullanım .CustomType("AnsiString") yerine varsayılan "String" ve NHibernate varchar yerine nvarchar kullanacaktır.

8

Doh.

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

Eğer isteseydi senin dizeleri Eğer bir kural kullanarak düşünebiliriz yerine nvarchar varchar eşlenmesi tüm:

/// <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"); 
    } 
} 

Sen eşleştirmeleri sonra basit bir eşleme dönebilsem:

:
Map(x => x.Context); 

Sadece emin kuralını kullanmak Akıcı NH anlatmak hatırlatacak

+0

Harika! Şimdi, ne olursa olsun TÜM mallarımı varchar olarak mı istersem? Sözleşmenin üzerine yazılmadan eşlemede bu varlığın CustomType'ı geçersiz kılabilir miyim? –

+0

@GerardoGrignoli: Evet yapabilirsin. Kurallar sadece varsayılanları belirler. Eğer ansi-string kuralı kullanırsanız ve daha sonra '.CustomType ' 'olması için belirli bir sütun eşlemesi yaparsanız, beklediğiniz gibi çalışır. – quetzalcoatl

0

"CustomType (" AnsiString ") seçeneğini kullanarak bulduğumuz seçenek nvarchar'ı kullanmasını engelliyor, ancak varchar (30) olarak belirtilen bir sütun için 8000 alan uzunluğunu ayarlar. 8000 varchar 4000 nvarchardan çok daha hızlıdır, ancak hala sql sunucu ek yükünde büyük sorunlara neden olmaktadır.

+1

Yani denediniz: Harita (x => x.Context) .CustomSqlType ("varchar (30)"); – Ted