将字符串设置为“varchar”的sql类型而不是“nvarchar”

时间:2010-02-26 20:46:57

标签: fluent-nhibernate schemaexport

我有以下映射:

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

但是,使用SchemaExport在SQL Server 2008中生成数据库时,生成的脚本会忽略长度,因此实际上它最终为长度为1的varchar

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

.CustomSqlType("varchar 512")抛出异常。如果没有定义CustomSqlType,字符串将映射到nvarchar(它确实尊重Length属性)。

有什么建议吗?

4 个答案:

答案 0 :(得分:23)

使用.CustomType("AnsiString")代替默认"String",NHibernate将使用varchar代替nvarchar

答案 1 :(得分:16)

如果您想将字符串的 所有 映射到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();

答案 2 :(得分:8)

卫生署。

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)
)

答案 3 :(得分:0)

我们发现使用“CustomType(”AnsiString“)”选项确实阻止它使用nvarchar,但是,它为指定为varchar(30)的列设置字段长度8000。 8000 varchar比4000 nvarchar快得多,但它仍然导致sql server开销的巨大问题。