我有以下映射:
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
属性)。
有什么建议吗?
答案 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开销的巨大问题。