ضبط السلسلة لتكون نوع 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);
}
}
ومع ذلك ، باستخدام 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 النفقات العامة.