باستخدام الدرجة تفاصيلها مع سؤال NHibernate مسمى

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

  •  20-08-2019
  •  | 
  •  

سؤال

وأنا باستخدام مخصص اسمه الاستعلام مع NHibernate التي أريد أن أعود مجموعة من الكائنات شخص. لم يتم تعيين الكائن شخص لديه مخطط NHibernate وهو ما يعني انني اتلقى الاستثناء التالي:

<اقتباس فقرة>   

وSystem.Collections.Generic.KeyNotFoundException:   وكان مفتاح معين موجود في   القاموس.

ويزداد طرح وعندما يحصل إنشاء الدورة لأنه لا يمكن العثور على اسم الفئة عندما يدعو NHibernate.Cfg.Mappings.GetClass (سلسلة اسم_الفئة). هذا هو كل شيء مفهوما إلى حد ما ولكن كنت أتساءل إذا كان هناك أي طريقة لمعرفة NHibernate استخدام فئة على الرغم من أنني لم يحصلوا على تعيين لذلك؟

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

المحلول 5

لحل هذا، انتهى بي الأمر باستخدام TupleToPropertyResultTransformer وتوفير قائمة من قيمة العقارات. وهناك عدد قليل من القيود إلى ذلك، أهمها أن الاستعلام SQL يجب أن يعود النتائج في نفس الترتيب كما يمكنك تقديم الممتلكات الخاصة بك إلى منشئ TupleToPropertyResultTransformer.

وأيضا يتم الاستدلال أنواع العقارات ولذلك عليك أن تكون حذرا مع الأعمدة العشرية ولم يعودوا إلا قيم الأعداد الصحيحة وما عدا ذلك باستخدام قدمت TupleToPropertyResultTransformer طريقة سهلة معقول لاستخدام استعلام SQL لإرجاع مجموعة من الكائنات دون رسم صراحة الكائنات ضمن NHibernate.

نصائح أخرى

لماذا لا يتم استخدام:

و query.SetResultTransformer(Transformers.AliasToBean(typeof(Person)));

ووسيتم إدراج البيانات من كل عمود في الاستعلام الخاص بك إلى خصائص الكائن شخص باستخدام عمود الاسم المستعار كاسم الممتلكات.

وكيف يمكنك إنشاء استعلام التي سيعود الحالات من النوع الذي لم يتم تعيينها؟

وأعتقد ميكال لديه نقطة هنا، وربما يجب عليك إلقاء نظرة على التوقعات. (على الأقل، هذا ما أعتقد كنت تبحث عن).

ويمكنك إنشاء استعلام على نوع معين، ومن ثم، يمكن 'المشروع' هذا الاستعلام إلى "DTO 'لك. من أجل القيام بذلك، سيكون لديك ل"استيراد" فئة الشخص، بحيث أنه من المعروف أن NHibernate، وسيكون لديك لاستخدام ResultTransformer.

وشيء من هذا القبيل:

ICriteria crit = session.CreateCriteria (typeof(Person));

// set some filter criteria

crit.SetProjection (Projections.ProjectionList()
                     .Add (Property("Name"), "Name")
                     .Add (Property( ... )
                   );

crit.SetResultTransformer(Transformers.AliasToBean(typeof(PersonView));

return crit.List<PersonView>();

ولكن، هذا لا يزال يعني سيكون لديك ل<لأ href = "http://infozerk.com/averyblog/refactoring-using-object-constructors-in-hql-with-nhibernate/" يختلط = "نوفولو noreferrer "> استيراد الطبقة، بحيث NHibernate يعرف عن ذلك.

وباستخدام الطبقة، فإن NHibernate أن تكون أساسا التخمين عن كل شيء المعنية بما في ذلك الجدول الذي كنت تعني استخدام لشخص وتعيينات المجال. NHibernate ربما يكون من الممكن اختراق للقيام دينامية ملزمة على أساس مطابقة أسماء أو شيء من هذا، ولكن الفكرة كلها هي لإنشاء تعيينات من كائن بيانات سهل القديمة إلى حقول قاعدة البيانات باستخدام ملفات XML.

إذا ليس هناك سبب وجيه حقا لا لتعيين الطبقة، مجرد إضافة التعيين سوف تعطيك أفضل النتائج ...

وقال ذلك، لا يمكنك استخدام استعلام اسمه لحقن مباشرة النتائج في فئة تفاصيلها. كنت بحاجة لمعرفة ما الأعمدة التي تريد وضعه في الحقول التي أو بعبارة أخرى، رسم الخرائط. ؛) ومع ذلك، يمكنك إرجاع القيم العددية من استعلام اسمه وكنت قد تأخذ هذه صفائف الكائن وبناء مجموعتك يدويا

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