ضبط السلسلة لتكون نوع SQL من "varchar" بدلاً من "nvarchar"

StackOverflow https://stackoverflow.com/questions/2344717

  •  23-09-2019
  •  | 
  •  

سؤال

لدي التعيين التالي:

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 منشأه).

أي اقتراحات؟

هل كانت مفيدة؟

المحلول

يستخدم .CustomType("AnsiString") بدلا من الافتراضي "String" وسيستخدم nhibernate varchar بدلاً من nvarchar.

نصائح أخرى

اذا كنت تريدين الكل من خيوطك التي سيتم تعيينها إلى 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);

فقط تأكد من أنك تتذكر أن تخبر 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)
)

لقد وجدنا باستخدام خيار "CustomType (" ansistring ")" يمنعه من استخدام NVARCHAR ، ومع ذلك ، فإنه يحدد طول الحقل 8000 لعمود محدد على أنه varchar (30). 8000 varchar أسرع بكثير من 4000 nvarchar ، لكنه لا يزال يسبب مشاكل كبيرة مع SQL Server النفقات العامة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top