13

私は次のマッピングを持っています:

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

ただし、SchemaExportSQL 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

4 に答える 4

23

.CustomType("AnsiString")デフォルトの代わりに使用し"String"、NHibernateはの代わりに使用varcharしますnvarchar

于 2010-04-21T07:23:03.580 に答える
17

すべての文字列を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);

FluentNHに規則を使用するように指示することを忘れないでください。

        var configuration = new Configuration();
        configuration.Configure();
        Fluently
            .Configure(configuration)
            .Mappings(m => m.FluentMappings
                .AddFromAssemblyOf<Widget>()
                .Conventions.Add<OurStringPropertyConvention>()
                )
            .BuildSessionFactory();
于 2011-09-27T07:17:00.510 に答える
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)
)
于 2010-02-26T20:51:01.230 に答える
0

「CustomType( "AnsiString")」オプションを使用すると、nvarcharを使用できなくなりますが、varchar(30)として指定された列のフィールド長は8000に設定されます。8000varcharは4000nvarcharよりもはるかに高速ですが、それでもSQLサーバーのオーバーヘッドに大きな問題を引き起こしています。

于 2015-03-02T23:06:25.737 に答える