Einstellen String sein SQL-Typ von „varchar“ anstelle von „nvarchar“
-
23-09-2019 - |
Frage
Ich habe die folgende Abbildung:
public class LogEntryMap
{
public LogEntryMap()
{
Map.Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Context).CustomSqlType("varchar").Length(512);
}
}
Allerdings SchemaExport
mit der Datenbank in SQL Server 2008 zu generieren, wird das Skript erzeugt Ignoriert die Länge so in der Tat endet eine varchar
mit einer Länge von 1 bis zu sein:
create table OV_SAC.dbo.[LogEntry] (
Id BIGINT IDENTITY NOT NULL,
Context varchar null,
primary key (Id)
)
.CustomSqlType("varchar 512")
löst eine Ausnahme. Und ohne die CustomSqlType
zu definieren, sind Strings nvarchar
abgebildet (die die Length
Eigenschaft nicht respektiert).
Irgendwelche Vorschläge?
Lösung
Verwenden .CustomType("AnsiString")
statt Standard "String"
und NHibernate varchar
anstelle von nvarchar
.
Andere Tipps
Wenn Sie wollen alle Ihr Strings varchar abgebildet wird anstelle von nvarchar 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 Zuordnungen könnten dann auf eine einfache Zuordnung zurück:
Map(x => x.Context);
So stellen Sie sicher erinnern Sie sich fliessend NH sagen die Konvention zu verwenden:
var configuration = new Configuration();
configuration.Configure();
Fluently
.Configure(configuration)
.Mappings(m => m.FluentMappings
.AddFromAssemblyOf<Widget>()
.Conventions.Add<OurStringPropertyConvention>()
)
.BuildSessionFactory();
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)
)
Wir fanden das „CustomType mit (“ Ansistring „)“ Option tut es verhindert, dass der nvarchar verwenden, aber es setzt die Feldlänge von 8000 für eine Spalte, die als varchar angegeben wird (30). Die 8000 varchar ist viel schneller als 4000 nvarchar, aber es verursacht immer noch große Probleme mit SQL-Server-Overhead.