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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top