سؤال

باستخدام 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 لكل خاصية.وهذا يعني أن توفير مغلفات نوع المستخدم الخاصة بك لكل خاصية سوف يفي بالغرض.

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