NHibernate.MappingException: इसके लिए कोई राजी नहीं: XYZ


134

अब, इससे पहले कि आप कहते हैं: मैं किया गूगल और मेरी 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: इसके लिए कोई राजी नहीं है: HQData.Objects.SubCategory] NHibernate.Impl.SessionFactoryImpl.GetEntityPersister (स्ट्रिंग इकाईनाम, बूलियनIIFNotFound)
 सी में: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionFactoryImpl.cs: 766 NHibernate.Impl.SessionFactoryImpl .GetEntityPersister (स्ट्रिंग इकाईनाम)
 c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionFactoryImpl.cs: 752 NHibernate.Event.Default.DefaultLoemEventListener.OnLoad (लोड इवेंट, लोडटाइप लोड टाइप)।
 c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Event \ Default \ DefaultLoadEventListener.cs: 37 NHibernate.Impl.SessionImpl.FlLoad (लोड इवेंट, लोडटाइप लोड टाइप)
 सी में: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 2054 NHibernate.Impl.SessionImpl.Get (स्ट्रिंग इकाई नाम, ऑब्जेक्ट आईडी)
 in c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 1029 NHibernate.Impl.SessionImpl.Get (टाइप एंटिटीक्लास, ऑब्जेक्ट आईडी)
 c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 1020 NHibernate.Impl.SessionImpl.Get (ऑब्जेक्ट आईडी)
 सी में: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 985 HQData.DataAccessUtils.NHibernatebbjectHelper.LoadDataObject (Int32 Id)
 C: \ Development \ HQChannelRepo \ HQ चैनल अनुप्रयोग \ HQChannel \ HQData \ DataAccessUtils \ NHibernateObjectHelper.cs: 42 HQWebsite.LocalSearch.get_subCategory ()
 C: \ Development \ HQChannelRepo \ HQ चैनल अनुप्रयोग \ HQChannel \ HQWebsite \ LocalSearch.aspx.cs: 17 HQWebsite.LocalSearch.Page_Load (ऑब्जेक्ट प्रेषक, EventArun e)
 C में: \ Development \ HQChannelRepo \ HQ चैनल एप्लिकेशन \ HQChannel \ HQWebsite \ LocalSearch.aspx.cs: 27 System.Web.Util.CalliHelper.EventArgactCaller (IntPtr fp, Object o, Object t, EventArgs e) +15 System.Web .Util.CalliEventHandlerDelegateProxy.Callback (ऑब्जेक्ट प्रेषक, EventArgs e) +33 System.Web.UI.Control.OnLoad (EventArgs e) +99.b.UI.Control.LoadRecursive () +47 System.Web.UI। .ProcessRequestMain (बूलियन में शामिल हैं

अद्यतन , यहाँ मेरे परिदृश्य के लिए समाधान क्या था: मैंने कुछ कोड को बदल दिया था और मैं रनटाइम के दौरान कॉन्फ़िगर फ़ाइल में असेंबली को नहीं जोड़ रहा था।


मेरे पास एक ही त्रुटि थी, लेकिन एक अलग मुद्दा। Session.Load ("SearchItem", searchItemID) के रूप में SearchItem एक मैपिंग त्रुटि देता है, Session.Load <SearchItem> (searchItemID) ऐसा नहीं करता (और वैसे भी करने का एक कम त्रुटि वाला तरीका है।
केंड्रिक

जवाबों:


101

लगता है कि आप सत्र कारखाना कॉन्फ़िगरेशन के लिए मैपिंग असेंबली जोड़ना भूल गए।

यदि आप 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>
.
.

7
यह धाराप्रवाह NHibernate में कैसे करें, मैं एक सीरपोरेट प्रोजेक्ट में एक पैटर्न विकसित कर रहा हूं, इसलिए मेरे पास उपयोगकर्ता असेंबली तक पहुंच नहीं है?
मुस्तफा मैगी

यदि आप उपयोगकर्ता असेंबली का संदर्भ नहीं दे सकते, तो मुझे नहीं लगता कि आप धाराप्रवाह NHibernate का उपयोग कर पाएंगे।
एंडी एस

91

कुछ स्पष्ट है, फिर भी NHibernate के लिए किसी के लिए काफी उपयोगी है।

सभी XML मैपिंग फ़ाइलों को डिफ़ॉल्ट सामग्री के बजाय एंबेडेड संसाधन के रूप में माना जाना चाहिए । यह विकल्प फ़ाइल के गुणों में बिल्ड एक्शन विशेषता को संपादित करके सेट किया गया है।

XML फ़ाइलों को फिर असेंबली में एम्बेड किया जाता है, और NHibernate के कॉन्फ़िगरेशन चरण के दौरान प्रोजेक्ट स्टार्टअप पर पार्स किया जाता है।


1
हेलुइया, मेरे पास यह एक के रूप में है Embedded resource, लेकिन जब मैंने इसे एक कंप्यूटर से दूसरे कंप्यूटर में कॉपी किया, तो फ़ाइल ने यह संपत्ति खो दी। मैंने कुछ मिनटों के लिए अपना सिर खुजलाया।
ड्रैगोस डर्लुट

1
@DragosDurlut प्रोजेक्ट फ़ाइल (.csproj) जो प्रोजेक्ट फ़ाइलों की जानकारी को सहेजती है, न कि फ़ाइल को।
वागनर लियोनार्डी

50

मेरा मुद्दा यह था कि मैं मैपिंग xml के नाम पर .hbm लगाना भूल गया। यह भी सुनिश्चित करें कि आप इसे एक एम्बेडेड संसाधन बनाते हैं!


1
वो भी मेरी गलती थी!
ग्रिंगो

यह मेरी समस्या भी थी, ठीक वैसा ही त्रुटि प्राप्त करें जैसा कि करते समय क्यू में होता है। उस प्रकार की सभी वस्तुओं को क्वेरी करने का प्रयास करते समय, कोई त्रुटि नहीं, बस एक खाली परिणाम सेट करें!
क्रिस्टोफ

अर्ग - .हबम को भी भूल गए। धन्यवाद!
डॉ। सी। हिलरियस

42

मुझे यह यहाँ से मिल गया :

मेरे मामले में मैपिंग क्लास सार्वजनिक नहीं थी। दूसरे शब्दों में, इसके बजाय:

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

मैने अभी किया:

class UserMap : ClassMap<user>

धन्यवाद, आपने मुझे थोड़ा सिरदर्द से बचाया है। :)
Rytmis

2
यदि आप धाराप्रवाह उपयोग कर रहे हैं, तो मैं कहूंगा कि यह अधिक सामान्य कारण होगा। धन्यवाद, यह याद करना बहुत आसान था।
रिचर्ड नील इलगन

1
धन्यवाद! यह जाँचने के लिए कि क्या मैंने अपनी मैपिंग कक्षाओं को सार्वजनिक किया है या नहीं, मुझे पता चला कि मैंने इस इकाई के लिए मैपिंग क्लास नहीं लिखा था - उफ़ !! :) समय के ढेर मुझे बचाया !!
जेन

28

पर 4 घंटे के बारे में खर्च googling और stackoverflowing , सामान के सभी वहाँ के आसपास की कोशिश कर रहा, मैं अपने त्रुटि पाया है:

मेरे मैपिंग फ़ाइल बुलाया गया था .nbm.xml के बजाय .hbm.xml । वह पागल था।


9
अर्घ, सिर्फ़ वैसा ही किया, जैसा कि मेरे पास था .hbm.xml के बजाय .xml। शायद त्रुटियों में कुछ संकेत होने चाहिए :)
रेजलर

2
हे भगवान। मुझे विश्वास नहीं हो रहा है कि मैंने ऐसा किया है। मैं त्रुटियों के लिए मैपिंग फ़ाइलों में घंटों खोज रहा था और यह पता चला है कि मैंने फ़ाइल नाम ... doh में एक टाइपो बनाया था। धन्यवाद! मुझे लगता है कि अगर मैं इस पार ठोकर खाई थी नहीं तो मैं अपने बालों को फाड़ रहा होगा सोचने के लिए कंपकंपी।
kamui

1
वाह, महान पकड़ - मैं इस समस्या पर अपने बाल खींच रहा था। मेरी xml फ़ाइल को सौ बार देखा और यह पता नहीं लगा सका कि यह दूसरों की तरह काम क्यों नहीं कर रही है। मुझे वास्तव में फ़ाइल नाम का ".hbm" भाग याद आ रहा था। धन्यवाद!
विंगर

आपने मेरे घंटे बचाए। धन्यवाद
Manjay_TBAG

4

मुझे भी ऐसी ही समस्या थी, और मैंने इसे फॉलोवर्स के रूप में हल किया:

मैं एमएस एसक्यूएल 2008 पर काम कर रहा हूं, लेकिन एनएच कॉन्फ़िगरेशन में मेरे पास खराब बोली थी: एनएचबर्नेट। डायलेक्ट। MsSql2005Dialect अगर मैं इसे सही करने के लिए: NHibernate.Dialect। MsSql2008Dialect तो अपवाद के बिना सब कुछ ठीक है "के लिए कोई राजी नहीं है: ..." डेविड।


3

मैं इनिशियलाइज़ेशन के दौरान गलत असेंबली भी जोड़ रहा था। मैं जो क्लास लगा रहा हूँ वह असेंबली # 1 में है, और मेरी .hbm.xml फ़ाइल असेंबली # 2 में एम्बेडेड है। मैंने cfg.AddAssembly(...असेंबली # 2 (असेंबली # 1 के बजाय) को जोड़ा और सब कुछ काम कर गया। धन्यवाद!


3

अमोल के जवाब में जोड़ने के लिए, इंटरफ़ेस वर्ग प्रकार को निर्दिष्ट करने की गलती न करें। सुनिश्चित करें कि आप कार्यान्वयन वर्ग निर्दिष्ट करते हैं । (यानी IDomainObjectType का उपयोग नहीं करेंगे)। ऐसा नहीं है कि मैंने यह गलती की है ... :)


2

क्या यह होना चाहिए name="Id"? टाइपो एक संभावित कारण हैं।

अगला यह सुनिश्चित करने के लिए होगा कि आप गैर-जेनेरिक परीक्षण के साथ यह सुनिश्चित करें कि आप उचित प्रकार के पैरामीटर में गुजर रहे हैं।

क्या आप संपूर्ण त्रुटि संदेश पोस्ट कर सकते हैं?


2

मुझे वही समस्या थी क्योंकि मैं कॉन्फ़िगरेशन में गलत असेंबली जोड़ रहा था। AddAssembly () विधि।


2

अमान्य मैपिंग कॉन्फ़िगरेशन के कारण यह त्रुटि होती है। आपको यह देखना चाहिए कि आपने कहां सेट किया है। अपने सत्र कारखाने के लिए मैपिंग। मूल रूप से अपनी परियोजना में "। मैपिंग (") के लिए खोज करें और सुनिश्चित करें कि आपने नीचे पंक्ति में सही इकाई वर्ग निर्दिष्ट किया है।

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

धन्यवाद दोस्त! मैंने उस परियोजना को स्विच किया जिसमें मेरी इकाइयां बैठी थीं!
अस्पष्ट

1

यदि एक अलग विधानसभा से रिपॉजिटरी पर परीक्षण चल रहा है, तो सुनिश्चित करें कि आपका Hibernate.cfg.xml उक्त विधानसभा की बिन निर्देशिका में हमेशा आउटपुट के लिए सेट है। यह हमारे लिए नहीं हो रहा था और हमें कुछ परिस्थितियों में उपरोक्त त्रुटि मिली।

अस्वीकरण: यह सलाह का एक थोड़ा गूढ़ सा हिस्सा हो सकता है, यह देखते हुए कि यह एक प्रत्यक्ष परिणाम है कि हम अपने रिपॉजिटरी इंटीग्रेशन टेस्ट असेंबलियों को कैसे तैयार करते हैं (यानी हमारे पास प्रत्येक टेस्ट असेंबली से एक एकल हाइबरनेट.एक्सफ़ग। Xml पर एक प्रतीकात्मक लिंक है)


1

.Config फ़ाइल में मैपिंग जानकारी निर्दिष्ट करना न भूलें

जैसे

जहाँ MyApp.Data असेंबली है जिसमें आपके मैपिंग शामिल हैं


0

इसी तरह की समस्या थी जब आईडी द्वारा एक वस्तु मिल ... सभी मैंने किया था वर्ग नाम में पूरी तरह से योग्य नाम का उपयोग करें। इससे पहले कि यह था:

find("Class",id)

वस्तु इस प्रकार हो गई:

find("assemblyName.Class",id)

0

सुनिश्चित करें कि आपने CreateCriteria(typeof(DomainObjectType))डोमेन ऑब्जेक्ट के लिए सत्र पर विधि को बुलाया है जिसे आप DB से लाने का इरादा रखते हैं।


यह एक दृढ़ता है, एक भ्रूण नहीं है।
यहोशू ड्रेक

0

मुझे एक समान समस्या है लेकिन सभी उल्लिखित आवश्यकताओं को पूरा किया जाता है। मेरे मामले में मैं कुछ इकाई वर्ग (OBJEKTE का प्रकार) को वापस DB में सहेजने का प्रयास करता हूं। अन्य स्थान काम करते हैं लेकिन केवल इस मामले में यह विफल रहता है और इस अपवाद को उठाता है।

मेरा समाधान (HACK) फिर से OBJEKTE प्रकार के objet को फिर से मैप करना और फिर उसे स्टोर करना था। अचानक यह काम करता है। लेकिन क्यों नहीं पूछें।

            OBJEKTE t = _mapper.Map<OBJEKTE>(inparam);
            OBJEKTE res = await _objRepo.UpdateAsync(t);

अगर inparam सीधे UpdateAsync () में चला जाएगा, तो यह एक मेलिंग फ़िस्टर्स नहीं मिल सकता है।

यह एनएच के ऐसा करने के तरीके से समझाया जा सकता है। यह आपके मानचित्रण वर्ग से एक प्रॉक्सी प्राप्त करता है और गंदे हैंडलिंग के साथ गुणों को लागू करता है। यह देखो:

t.GetType()
{Name = "OBJEKTE" FullName = "MyComp.Persistence.OBJEKTE"}

inparam.GetType()
{Name = "OBJEKTEProxyForFieldInterceptor" FullName = "OBJEKTEProxyForFieldInterceptor"}

हालांकि मजेदार बात यह है कि इसका स्रोत inparamवास्तव में एनएच भंडार ही है। वैसे भी। मैं अगली बार इस रीसाइन हैक के साथ रहता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.