يقوم NHibernate بإضافة عمود غير معين في المعترض

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

  •  05-07-2019
  •  | 
  •  

سؤال

أحاول حفظ كيان معين باستخدام NHibernate ولكن فشل إدراجي في قاعدة البيانات لأن الجدول الأساسي يحتوي على عمود لا يسمح بالقيم الخالية ولم يتم تعيينه في كائن المجال الخاص بي.سبب عدم تعيينه هو أن العمود المعني يدعم تطبيقًا قديمًا وليس له أي صلة بطلبي - لذلك لا أرغب في تلويث الكيان الخاص بي بالخاصية القديمة.

أعلم أنه يمكنني استخدام مجال خاص داخل صفي - لكن هذا لا يزال يبدو سيئًا بالنسبة لي.لدي يقرأ يمكنني استخدام اعتراض NHibernate وتجاوز طريقة OnSave () لإضافتها في العمود الجديد مباشرة قبل حفظ الكيان الخاص بي.قد يكون هذا أمرًا صعبًا لأنني لا أستطيع معرفة كيفية إضافة مثيل Nhibernate.type.IType إلى معلمة الأنواع الخاصة بـ OnSave الخاص بالمعترض.

يبدو كياني تقريبًا كما يلي:

public class Client
{
    public virtual int Id { get; set; }
    public virtual int ParentId { get; set; }
    public virtual string Name { get; set; }
    public virtual string Phone { get; set; }
    public virtual string Email { get; set; }
    public virtual string Url { get; set; }
}

ومعترضي

 public class ClientInterceptor : EmptyInterceptor
{

    public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types)
    {
        if (entity is Client)
        {
            /*
              manually add the COM_HOLD column to the Client entity
            */
            List<string> pn_list = propertyNames.ToList();
            pn_list.Add("COM_HOLD");
            propertyNames = pn_list.ToArray();

            List<Object> _state = state.ToList();
            _state.Add(false);
            state = _state.ToArray();

            //somehow add an IType to types param ??

         }
         return base.OnSave(entity, id, state, propertyNames, types);
    }
}

هل لدى أي شخص أي أفكار حول كيفية القيام بذلك بشكل صحيح؟

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

المحلول

لا أستطيع أن أقول ذلك على وجه اليقين لأنني لم أفعل هذا مطلقًا (مثل ستيفان، أفضل أيضًا إضافة ملكية خاصة فقط)، ولكن هل يمكنك فقط إضافة NHibernate.Type.BooleanType إلى types مجموعة مصفوفة؟

List<IType> typeList = types.ToList();
typeList.Add(new BooleanType());
types = typesList.ToArray();

يحرر

نعم، يبدو أنك على حق؛الأنواع لديها internal البناء.لقد قمت ببعض الحفر ووجدت TypeFactory:

يجب أن تستخدم التطبيقات أساليب وثوابت ثابتة على nhibernate.nhibernateUtil إذا كانت Itype الافتراضية جيدة بما فيه الكفاية.على سبيل المثال ، يجب استخدام النوع typefactory فقط عندما تحتاج السلسلة إلى طول 300 بدلاً من 255.في هذه المرحلة ، لا يجعلك nhibernate.String يصححك.بدلاً من ذلك ، استخدم kypactory.getString (300) واحتفظ بمتغير محلي يحمل إشارة إلى Itype.

لذلك يبدو أن ما تريد هو NHibernateUtil:

يوفر الوصول إلى النطاق الكامل لأنواع Nhibernate المدمجة.يمكن استخدام مثيلات Itype لربط القيم لمعلمات الاستعلام.أيضا مصنع للنقاط الجديدة والقرص.

typeList.Add(NHibernateUtil.Boolean);

نصائح أخرى

وانا شخصيا لن تفعل ذلك معقدة جدا. وأود أن أضيف الملكية الخاصة وتعيين قيمة افتراضية - انتهى. هل يمكن أيضا النظر في القيمة الافتراضية في قاعدة البيانات، فإنك لا تحتاج إلى القيام بأي شيء آخر.

private virtual bool COM_HOLD 
{ 
  get { return false; } 
  set { /* make NH happy */ } 
}

وقبل كتابة اعتراضية لذلك أود أن تنظر لكتابة مشغل قاعدة البيانات. لأنه مع المعترض كنت "الملوثة" طبقة الوصول إلى البيانات الخاصة بك. أنه قد جعله غير مستقر وكنت <م> قد لديك مشاكل غريبة.

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