SQL「varchar型」のタイプの代わりに、「nvarchar型」であることを、文字列を設定します
-
23-09-2019 - |
質問
私は、次のマッピングを持っています:
public class LogEntryMap
{
public LogEntryMap()
{
Map.Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Context).CustomSqlType("varchar").Length(512);
}
}
ただし、SQL Server 2008のデータベースを生成するSchemaExport
を使用して、スクリプトが生成さ無視長さが非常に有効で、それは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
性を尊重している)。
任意の提案ですか?
解決
の代わりにデフォルト.CustomType("AnsiString")
とNHibernateはの使用"String"
ではなくvarchar
のnvarchar
を使用します。
他のヒント
あなたが規則を使用して検討することもでき代わりにnvarchar型のvarchar型にマップすることにあなたの文字列の のすべてののを望んだ場合:
を/// <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);
だけを確認してくださいあなたが規則を使用する流暢NHを伝えるために覚えてます:
var configuration = new Configuration();
configuration.Configure();
Fluently
.Configure(configuration)
.Mappings(m => m.FluentMappings
.AddFromAssemblyOf<Widget>()
.Conventions.Add<OurStringPropertyConvention>()
)
.BuildSessionFactory();
いやはやます。
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)
)
我々は、しかし、それはVARCHAR(30)として指定されている列の8000のフィールド長を設定し、オプションがNVARCHARを使用することを防止し、「(AnsiStringの「)」CustomType」を使用して発見しました。 8000 varchar型は、はるかに高速4000 nvarchar型よりも、それはまだ、SQLサーバーのオーバーヘッドを持つ巨大な問題を引き起こしています。
所属していません StackOverflow