سؤال

لدي قاعدة بيانات Oracle وأحد الحقول هي حقل نطاق التاريخ. يتم تخزينه بشكل أساسي في قاعدة البيانات باعتباره varchar (40) بتنسيق yyyy/mm/dd-yyyy/mm/dd. أرغب في تعيينه في nhibernate إلى فئة مخصصة قمت بإنشائها مثل هذا

public class DateTimeRange
{
    public DateTimeRange(DateTime fromTime, DateTime toTime)
    {
        FromTime = fromTime;
        ToTime = toTime;
    }

    public override string ToString()
    {
        return String.Format("{0} to {1}", FromTime.ToString("HH:mm:ss"), ToTime.ToString("HH:mm:ss"));
    }

    public DateTime FromTime { get; set; }

    public DateTime ToTime { get; set; }
}

كيف يمكنني تعيين فصول مخصصة مثل هذا؟

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

المحلول

تحتاج إلى تنفيذ iusertype الخاص بك.

انظر الى هذا مشاركة مدونة للتفاصيل. سألصق القسم ذي الصلة أدناه في حالة اختفاء المدونة.

في nhibernate ، نوع رسم الخرائط المخصص هو فئة مستمدة من واجهات iusertype أو icompositeSerType. تحتوي هذه الواجهات على عدة طرق يجب تنفيذها ، ولكن لأغراضنا هنا ، سنركز على 2 منها. النظر في ما يلي.

  public class TypeClassUserType : IUserType
  {


    object IUserType.NullSafeGet(IDataReader rs, 
      string[] names, 
     object owner) {

     string name = NHibernateUtil.String.NullSafeGet(rs, 
     names[0]) as string;

     TypeClassFactory factory = new TypeClassFactory();
     TypeClass typeobj = factory.GetTypeClass(name);
     return typeobj;
   }

    void IUserType.NullSafeSet(IDbCommand cmd, 
    object value, 
     int index) {

      string name = ((TypeClass)value).Name;
     NHibernateUtil.String.NullSafeSet(cmd, name, index);
    }
  }

بعد إنشاء هذه الفئة ، يمكنني الآن تعيين العلاقة بين CONCLass و Typeclass بشكل صريح كخاصية بسيطة على رسم الخرائط الفعلية.

<property
  name="Type"
  column="TypeName"
  type="Samples.NHibernate.DataAccess.TypeClassUserType, 
        Samples.NHibernate.DataAccess" />

نظرًا لأن nhibernate هو في طور حفظ مثيل لـ actileType ، فسيتم تحميله وإنشاء مثيل جديد من typeclassusertype واستدعاء طريقة nullsafeset. كما ترون من جسم الطريقة ، أقوم ببساطة باستخراج الاسم من الخاصية المعينة (تم تمريرها كمعلمة قيمة) وأعزّق الاسم المستخرج كقيمة للمعلمة المراد تعيينها في قاعدة البيانات. النتيجة الصافية هي أنه على الرغم من أن خاصية نوع Class هي typeclass في نموذج المجال ، إلا أن خاصية اسم كائن typeclass يتم تخزينها في قاعدة البيانات. والعكس صحيح أيضا. عندما تقوم Nhibernate بتحميل مثيل من النمط الفعلي من قاعدة البيانات ويجد خاصية من نوع التعيين المخصص الخاص بي ، فإنه يقوم بتحميل نوعي المخصص ويطلق على طريقة Nullsafeget. كما ترون ، تحصل طريقتي على الاسم من البيانات التي تم إرجاعها ، وتدعو مصنع وزن الذبابة للحصول على المثيل الصحيح من typeclass ، ثم يعيد هذا المثيل فعليًا. تحدث عملية دقة النوع بشفافية إلى فئات الوصول إلى البيانات الخاصة بي (وحتى إلى nhibernate نفسها لهذه المسألة).

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