Установка строки для типа sql "varchar" вместо "nvarchar" - PullRequest
12 голосов
/ 26 февраля 2010

У меня есть следующее отображение:

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

Однако, используя SchemaExport для генерации базы данных в SQL Server 2008, сгенерированный сценарий игнорирует длину, поэтому в итоге получается varchar с длиной 1:

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

.CustomSqlType("varchar 512") выдает исключение. И без определения CustomSqlType строки отображаются на nvarchar (что соответствует свойству Length).

Есть предложения?

Ответы [ 4 ]

23 голосов
/ 21 апреля 2010

Используйте .CustomType("AnsiString") вместо значения по умолчанию "String", а NHibernate будет использовать varchar вместо nvarchar.

16 голосов
/ 27 сентября 2011

Если вы хотите, чтобы все ваших строк были сопоставлены с varchar вместо nvarchar, вы можете использовать соглашение:

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

Затем вы можете вернуться к простому отображению:

Map(x => x.Context);

Просто убедитесь, что вы не забыли сказать Fluent NH использовать соглашение:

        var configuration = new Configuration();
        configuration.Configure();
        Fluently
            .Configure(configuration)
            .Mappings(m => m.FluentMappings
                .AddFromAssemblyOf<Widget>()
                .Conventions.Add<OurStringPropertyConvention>()
                )
            .BuildSessionFactory();
8 голосов
/ 26 февраля 2010

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)
)
0 голосов
/ 03 марта 2015

Мы обнаружили, что использование опции «CustomType (« AnsiString »)» не позволяет использовать nvarchar, однако она устанавливает длину поля 8000 для столбца, который указан как varchar (30). 8000 varchar намного быстрее, чем 4000 nvarchar, но все еще вызывает огромные проблемы с нагрузкой на сервер sql.

...