2010-02-26 20 views
12

Ho il seguente mappatura:stringa di impostazione per essere di tipo SQL di "varchar" invece di "nvarchar"

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

Tuttavia, utilizzando SchemaExport per generare il database in SQL Server 2008, generato lo script ignora la lunghezza così in effetti si finisce per essere un varchar con lunghezza di 1:

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

.CustomSqlType("varchar 512") genera un'eccezione. E senza definire lo CustomSqlType, le stringhe sono mappate su nvarchar (che rispetta la proprietà Length).

Qualche suggerimento?

risposta

22

Uso .CustomType("AnsiString") al posto di predefinito "String" e NHibernate utilizzerà varchar invece di nvarchar.

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

se si voleva tutte delle corde da mappare a VARCHAR invece di nvarchar si potrebbe considerare l'utilizzo di una convenzione:

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

Voi mappature potrebbe quindi tornare a una semplice mappatura:

Map(x => x.Context); 

Basta assicurarsi che si ricorda di dire Fluent NH a utilizzare la convenzione:

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

Ottimo !! Ora, cosa succede se voglio TUTTE le mie proprietà come varchar, tranne una? Posso sovrascrivere CustomType per quell'entità nella mappatura senza essere sovrascritto dalla convenzione? –

+0

@GerardoGrignoli: sì, puoi. Le convenzioni impostano solo i valori predefiniti. Se si utilizza la convenzione ansi-string e quindi si crea una mappatura di colonne specifica per avere ". CustomType ", funzionerà esattamente come ci si aspetterebbe. – quetzalcoatl

0

Abbiamo trovato che l'utilizzo dell'opzione "CustomType (" AnsiString ")" impedisce l'utilizzo di nvarchar, tuttavia imposta la lunghezza del campo di 8000 per una colonna specificata come varchar (30). L'8000 varchar è molto più veloce di 4000 nvarchar, ma continua a causare enormi problemi con l'overhead del server SQL.

+1

Quindi hai provato: Map (x => x.Context). CustomSqlType ("varchar (30)"); – Ted

Problemi correlati