نوع مستخدم السبات المركب:كيفية تحديد أنواع Sql؟
-
21-08-2019 - |
سؤال
باستخدام NH 2.0، لدي نوع مخصص.وهي تتألف من أربع عقارات ، لذلك قمت بتنفيذها ICompositeUserType
.
أريد تحديد الطول والدقة للسلسلة والخصائص العشرية ضمن نوع المستخدم، لتجنب تحديده مع كل استخدام في ملفات التعيين.
ولكن لا يوجد سوى أ PropertyTypes
خاصية للتنفيذ ، والتي تعود
IType.الشيء المضحك هو أن IUserType
لديه SqlTypes
ملكية،ICompositeUserType
لا.
- هل يجب علي تنفيذ كلا الواجهتين؟
- هل يجب علي تطبيق نوع مستخدم لالتفاف كل نوع SQL الذي أريد تحديده؟
- أو كيف يمكنني تحديد نوع Sql لنوع المستخدم المركب؟
شكرًا جزيلاً.
المحلول 2
لقد وجدت الحل، وهو بسيط جدًا.لا بد لي من إنشاء أنواع NHibernate باستخدام ملف TypeFactory
:
public IType[] PropertyTypes
{
get
{
return new []
{
TypeFactory.GetDecimalType(36, 18),
TypeFactory.GetStringType(100)
}
}
}
نصائح أخرى
أوصي بتنزيل الكود المصدري لهذا النوع من الحفر (NH 2.0).
قم أولاً بإلقاء نظرة على طريقة TypeFactory.HeuristicType، التي تقوم بإنشاء مثيل IType.
...
else if (typeof(ICompositeUserType).IsAssignableFrom(typeClass))
{
type = new CompositeCustomType(typeClass, parameters);
}
else if (typeof(IUserType).IsAssignableFrom(typeClass))
{
type = new CustomType(typeClass, parameters);
}
...
لذا، إذا كان النوع المخصص الخاص بك يطبق ICompositeUserType، فسيتم إنشاء مثيل له كفئة CompositeCustomType.وهذا يلغي إمكانية تطبيق واجهات ICompositeUserType وIUserType.
الآن دعونا نلقي نظرة على CompositeCustomType
public override SqlType[] SqlTypes(IMapping mapping)
{
IType[] types = userType.PropertyTypes;
SqlType[] result = new SqlType[GetColumnSpan(mapping)];
int n = 0;
for (int i = 0; i < types.Length; i++)
{
SqlType[] sqlTypes = types[i].SqlTypes(mapping);
for (int k = 0; k < sqlTypes.Length; k++)
{
result[n++] = sqlTypes[k];
}
}
return result;
}
لذا فهو يأخذ الأنواع التي تم إرجاعها من PropertyTypes ويبني SqlType لكل خاصية.وهذا يعني أن توفير مغلفات نوع المستخدم الخاصة بك لكل خاصية سوف يفي بالغرض.