سؤال

الآن، قبل أن تقول ذلك:أنا فعل جوجل وبلدي hbm.xml ملف يكون مورد مضمن.

هذا هو الرمز الذي أتصل به:

ISession session = GetCurrentSession();
var returnObject =  session.Get<T>(Id);

إليك ملف التعيين الخاص بي للفصل:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="HQData.Objects.SubCategory, HQData" table="SubCategory" lazy="true">
    <id name="ID" column="ID" unsaved-value="0">
      <generator class="identity" />
    </id>

    <property name="Name" column="Name" />
    <property name="NumberOfBuckets" column="NumberOfBuckets"  />
    <property name="SearchCriteriaOne" column="SearchCriteriaOne" />

    <bag name="_Businesses" cascade="all">
      <key column="SubCategoryId"/>
      <one-to-many 
         class="HQData.Objects.Business, HQData"/>
    </bag>

    <bag name="_Buckets" cascade="all">
      <key column="SubCategoryId"/>
      <one-to-many
         class="HQData.Objects.Bucket, HQData"/>
    </bag>

  </class>
</hibernate-mapping>

هل قام أحد بتشغيل هذه المشكلة من قبل؟

فيما يلي رسالة الخطأ الكاملة:

MappingException: No persister for:  HQData.Objects.SubCategory]NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName, Boolean throwIfNotFound)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionFactoryImpl.cs:766 NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionFactoryImpl.cs:752 NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Event\Default\DefaultLoadEventListener.cs:37 NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:2054 NHibernate.Impl.SessionImpl.Get(String entityName, Object id)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:1029 NHibernate.Impl.SessionImpl.Get(Type entityClass, Object id)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:1020 NHibernate.Impl.SessionImpl.Get(Object id)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:985 HQData.DataAccessUtils.NHibernateObjectHelper.LoadDataObject(Int32 Id)
 in C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQData\DataAccessUtils\NHibernateObjectHelper.cs:42 HQWebsite.LocalSearch.get_subCategory()
 in C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQWebsite\LocalSearch.aspx.cs:17 HQWebsite.LocalSearch.Page_Load(Object sender, EventArgs e)
 in C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQWebsite\LocalSearch.aspx.cs:27 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +33 System.Web.UI.Control.OnLoad(EventArgs e) +99 System.Web.UI.Control.LoadRecursive() +47 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436

تحديث, ، إليك الحل لي السيناريو كان:لقد قمت بتغيير بعض التعليمات البرمجية ولم أقم بإضافة التجميع إلى ملف التكوين أثناء وقت التشغيل.

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

المحلول

يبدو أنك نسيت إضافة مجموعة تعيين إلى تكوين مصنع الجلسة.

إذا كنت تستخدم app.config...

.
.
    <property name="show_sql">true</property>
    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    <mapping assembly="Project.DomainModel"/>  <!-- Here -->
</session-factory>
.
.

نصائح أخرى

شيء واضح، لكنه مفيد جدًا لشخص جديد في NHibernate.

يجب التعامل مع كافة ملفات تعيين XML على أنها الموارد المضمنة بدلا من الافتراضي محتوى.يتم تعيين هذا الخيار عن طريق تحرير سمة Build Action في خصائص الملف.

يتم بعد ذلك تضمين ملفات XML في التجميع، ويتم تحليلها عند بدء تشغيل المشروع أثناء مرحلة تكوين NHibernate.

مشكلتي هي أنني نسيت وضع .hbm في اسم تعيين XML.تأكد أيضًا من جعله موردًا مضمنًا!

حصلت على هذا الخروج من هنا:

في حالتي لم تكن فئة رسم الخرائط عامة.وبعبارة أخرى، بدلا من:

public class UserMap : ClassMap<user>  // note the public!

كان لدي للتو:

class UserMap : ClassMap<user>

قضاء حوالي 4 ساعات على البحث في غوغل و com.stackoverflowing, ، أثناء تجربة كل الأشياء الموجودة هناك، وجدت الخطأ الخاص بي:

تم استدعاء ملف التعيين الخاص بي .nbm.xml بدلاً من .hbm.xml.كان ذلك جنونًا.

واجهتني مشكلة مماثلة وقمت بحلها كالتالي:

أنا أعمل على MS SQL 2008، ولكن في تكوين NH كان لدي لهجة سيئة:NHibernate.اللهجة.MsSql2005Dialectإذا قمت بتصحيحه إلى:NHibernate.اللهجة.MsSql2008Dialectثم كل شيء يعمل بشكل جيد دون استثناء "لا يوجد استمرار لـ:... "ديفيد.

كنت أقوم أيضًا بإضافة التجميع الخاطئ أثناء التهيئة.الفصل الذي أستمر فيه موجود في التجميع رقم 1، وملف .hbm.xml الخاص بي مضمن في التجميع رقم 2.لقد تغيرت cfg.AddAssembly(... لإضافة التجميع رقم 2 (بدلاً من التجميع رقم 1) وعمل كل شيء.شكرًا!

للإضافة إلى إجابة أمول، لا ترتكب خطأ تحديد نوع فئة الواجهة. تأكد من تحديد فئة التنفيذ.(أي.لا تستخدم IDomainObjectType).ليس لأنني ارتكبت هذا الخطأ..:)

هل يجب أن تكون name="Id"؟الأخطاء المطبعية هي السبب المحتمل.

سيكون التالي هو تجربة ذلك باستخدام اختبار غير عام للتأكد من أنك تقوم بتمرير معلمة النوع المناسبة.

هل يمكنك نشر رسالة الخطأ بأكملها؟

واجهت نفس المشكلة لأنني كنت أقوم بإضافة التجميع الخاطئ في طريقة Configuration.AddAssembly().

يحدث هذا الخطأ بسبب تكوين التعيين غير صالح.يجب عليك التحقق من المكان الذي قمت بتعيين .Mappings لمصنع الجلسة الخاصة بك.ابحث بشكل أساسي عن ".Mappings(" في مشروعك وتأكد من تحديد فئة الكيان الصحيحة في السطر أدناه.

.Mappings(m => m.FluentMappings.AddFromAssemblyOf<YourEntityClassName>())

في حالة إجراء اختبارات على المستودع من تجميع منفصل، فتأكد من تعيين Hibernate.cfg.xml الخاص بك على الإخراج دائمًا في دليل bin للتجميع المذكور.لم يكن هذا يحدث بالنسبة لنا، وقد حصلنا على الخطأ أعلاه في ظروف معينة.

تنصل:قد تكون هذه نصيحة مقصورة على فئة معينة إلى حد ما، نظرًا لأنها نتيجة مباشرة لكيفية تنظيم مجموعات اختبار تكامل المستودعات (أي:لدينا رابط رمزي من كل مجموعة اختبار إلى Hibernate.xfg.xml واحد)

لا تنس تحديد معلومات التعيين في ملف .config

على سبيل المثال

حيث MyApp.Data عبارة عن تجميع يحتوي على تعييناتك

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

find("Class",id)

الكائن فأصبح هكذا:

find("assemblyName.Class",id)

تأكد من أنك اتصلت بـ CreateCriteria(typeof(DomainObjectType)) الطريقة في الجلسة لكائن المجال الذي تنوي جلبه من قاعدة البيانات.

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