2010-02-26 7 views
12

Ich habe die folgende Abbildung zu sein:Einstellung String sql Art „varchar“ anstelle von „nvarchar“

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

jedoch SchemaExport mit der Datenbank in SQL Server 2008 zu generieren, ignoriert das Skript generiert die Länge so in der Tat endet er ein varchar mit einer Länge von 1 bis ist:

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

.CustomSqlType("varchar 512") eine Ausnahme ausgelöst. Und ohne die CustomSqlType zu definieren, werden Zeichenfolgen auf nvarchar zugeordnet (was die Length-Eigenschaft berücksichtigt).

Irgendwelche Vorschläge?

Antwort

22

Verwenden .CustomType("AnsiString") statt Standard "String" und NHibernate wird varchar statt nvarchar verwenden.

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

Wenn Sie wollten alle Ihrer Strings zugeordnet werden, anstatt nvarchar in varchar Sie in Erwägung ziehen könnte eine Konvention mit:

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

Sie Mappings dann zurück auf eine einfache Zuordnung gehen könnte:

Map(x => x.Context); 

So stellen Sie sicher, dass Sie fliessend NH zu erinnern Sie sich, die Konvention zu verwenden:

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

Großartig !! Was nun, wenn ich ALLE meine Eigenschaften als varchar haben möchte, außer einem? Kann ich den CustomType für diese Entität im Mapping überschreiben, ohne von der Konvention überschrieben zu werden? –

+0

@GerardoGrignoli: ja du kannst. Konventionen setzen nur die Standardeinstellungen. Wenn Sie ansi-string-Konvention verwenden und dann eine bestimmte Spaltenzuordnung erstellen, z. B. '.CustomType ', wird es so funktionieren, wie Sie es erwarten. – quetzalcoatl

0

Wir haben festgestellt, dass die Verwendung der Option "CustomType (" AnsiString ") die Verwendung von nvarchar verhindert, setzt jedoch die Feldlänge 8000 für eine Spalte, die als varchar (30) angegeben ist. Der 8000 varchar ist viel schneller als 4000 nvarchar, verursacht aber immer noch große Probleme mit dem Sql-Server-Overhead.

+1

Also haben Sie versucht: Karte (x => x.Context) .CustomSqlType ("varchar (30)"); – Ted