NHibernate.MappingException: ไม่มีสำหรับ: XYZ


135

ตอนนี้ก่อนที่คุณพูดมัน: ผมไม่ได้ Google และฉัน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: ไม่มี Persister สำหรับ: HQData.Objects.SubCategory] NHibernate.Impl.SessionFactoryImpl.GetEntityPersister (String entityName, Boolean throwIfNotFound)
 ใน c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionFactoryImpl.cs: 766 NHibernate.Impl.SessionFactoryImpl.GetEntityPersister (String entityName)
 ใน c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionFactoryImpl.cs: 752 NHibernate.Event.Default.DefaultLoadEventListener OnLoad (เหตุการณ์ LoadEvent, LoadType loadType)
 ใน c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Event \ Default \ DefaultLoadEventListener.cs: 37 NHibernate.Impl.SessionImpl.FireLoad (เหตุการณ์ LoadEvent, LoadType loadType)
 ใน c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 2054 NHibernate.Impl.SessionImpl.Get (String entityName, Object id)
 ใน c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 1029 NHibernate.Impl.SessionImpl.Get (Type entityClass, Object id)
 ใน c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 1020 NHibernate.Impl.SessionImpl.Get (Object id)
 ใน c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 985 HQData.DataAccessUtils.NHibernateObjectHelper.LoadDataObject (Int32 Id)
 ใน C: \ Development \ HQChannelRepo \ HQ Channel Application \ HQChannel \ HQData \ DataAccessUtils \ NHibernateObjectHelper.cs: 42 HQWebsite.LocalSearch.get_subCategory ()
 ใน C: \ Development \ HQChannelRepo \ HQ Channel Application \ HQChannel \ HQWebsite \ LocalSearch.aspx.cs: 17 HQWebsite.LocalSearch.Page_Load (Object sender, EventArgs e)
 ใน 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 (ผู้ส่งวัตถุ, EventArgs e) +33 System.Web.UI.Control OnLoad (EventArgs e) +99 System.Web.UI.Control.LoadRecursive () +47 System.Web.UI.Page .ProcessRequestMain (บูลีน includeStagesBeforeAsyncPoint บูลีนรวมStagesAfterAsyncPoint) +1436

อัปเดตนี่คือวิธีแก้ปัญหาสำหรับสถานการณ์ของฉัน : ฉันได้เปลี่ยนรหัสบางส่วนและฉันไม่ได้เพิ่มแอสเซมบลีในไฟล์กำหนดค่าระหว่างรันไทม์


ฉันมีข้อผิดพลาดเดียวกัน แต่เป็นปัญหาอื่น Session.Load ("SearchItem", searchItemID) เนื่องจาก SearchItem ส่งกลับข้อผิดพลาดในการทำแผนที่ Session.Load <SearchItem> (searchItemID) ไม่ทำ (และเป็นข้อผิดพลาดน้อยกว่าที่จะทำได้
Kendrick

คำตอบ:


102

ดูเหมือนว่าคุณลืมเพิ่มแอสเซมบลีการแมปในการกำหนดค่าโรงงานเซสชัน ..

หากคุณใช้ 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
วิธีการทำใน Fluent NHibernate ฉันกำลังพัฒนารูปแบบในโปรเจ็กต์ต่อเนื่องดังนั้นฉันจึงไม่มีสิทธิ์เข้าถึงแอสเซมบลีผู้ใช้
Mustafa Magdy

หากคุณไม่สามารถอ้างอิงแอสเซมบลีของผู้ใช้ฉันไม่คิดว่าคุณจะสามารถใช้ Fluent NHibernate ได้
Andy S

91

สิ่งที่ชัดเจน แต่มีประโยชน์มากสำหรับผู้ที่เพิ่งเริ่มใช้ NHibernate

ไฟล์ทั้งหมดที่แมป XML ควรจะถือว่าเป็นทรัพยากรที่ฝังตัวแทนที่จะเริ่มต้นเนื้อหา ตัวเลือกนี้ตั้งค่าโดยการแก้ไขแอตทริบิวต์ Build Action ในคุณสมบัติของไฟล์

จากนั้นไฟล์ XML จะถูกฝังลงในแอสเซมบลีและแยกวิเคราะห์เมื่อเริ่มต้นโปรเจ็กต์ระหว่างเฟสคอนฟิกูเรชันของ NHibernate


1
Haleluia ฉันมีมันเป็นไฟล์Embedded resourceแต่เมื่อฉันคัดลอกจากคอมพิวเตอร์เครื่องหนึ่งไปยังอีกเครื่องหนึ่งไฟล์จะสูญเสียคุณสมบัตินี้ ฉันเกาหัวสองสามนาทีดีๆ
Dragos Durlut

1
@DragosDurlut ไฟล์โครงการ (.csproj) ที่บันทึกข้อมูลของไฟล์โครงการไม่ใช่ไฟล์นั้นเอง
Wagner Leonardi

51

ปัญหาของฉันคือฉันลืมใส่. hbm ในชื่อของ xml การแมป ตรวจสอบให้แน่ใจว่าคุณทำให้เป็นทรัพยากรที่ฝังไว้


1
นั่นเป็นความผิดพลาดของฉันด้วย!
Gringo

นี่เป็นปัญหาของฉันเช่นกันรับข้อผิดพลาดเช่นเดียวกับใน Q เมื่อได้รับ เมื่อพยายามค้นหาวัตถุประเภทนั้นทั้งหมดไม่มีข้อผิดพลาดเพียงแค่ชุดผลลัพธ์ว่างเปล่า!
Christoph

เถียง - ลืม. hbm ด้วย ขอบคุณ!
Dr. C. Hilarius

43

ฉันออกจากที่นี่ :

ในกรณีของฉันคลาสการทำแผนที่ไม่ได้เป็นแบบสาธารณะ กล่าวอีกนัยหนึ่งแทนที่จะเป็น:

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

ฉันเพิ่งมี:

class UserMap : ClassMap<user>

ขอบคุณคุณเพิ่งช่วยฉันจากอาการปวดหัว :)
Rytmis

2
หากคุณใช้ Fluent ฉันจะบอกว่านี่อาจเป็นสาเหตุที่พบบ่อยกว่า ขอบคุณที่พลาดง่ายมาก
Richard Neil Ilagan

1
ขอบคุณ! ในการตรวจสอบว่าฉันทำให้คลาสการทำแผนที่ของฉันเป็นแบบสาธารณะหรือไม่ฉันพบว่าฉันไม่ได้เขียนคลาสการทำแผนที่สำหรับเอนทิตีนี้ - อ๊ะ !! :) ช่วยฉันได้หลายเวลา !!
เจน

28

ใช้เวลาประมาณ 4 ชั่วโมงในการgooglingและstackover ล้นลองทุกอย่างที่นั่นฉันพบข้อผิดพลาดของฉัน:

ไฟล์การแมปของฉันถูกเรียกว่า. nbm.xmlแทนที่จะเป็น . hbm.xml นั่นเป็นบ้า


9
อ๊ะเพิ่งทำเช่นเดียวกันยกเว้นฉันมีเป็น. xml แทนที่จะเป็น. hbm.xml อาจจะมีคำใบ้ในข้อผิดพลาด :)
Rezler

2
พระเจ้าช่วย. ฉันไม่อยากจะเชื่อเลยว่าฉันทำแบบนี้ ฉันค้นหาข้อผิดพลาดในการแมปไฟล์เป็นเวลาหลายชั่วโมงและปรากฎว่าฉันพิมพ์ผิดในชื่อไฟล์ ... doh ขอบคุณ! ฉันตัวสั่นเมื่อคิดว่าจะต้องฉีกผมออกไปอีกนานแค่ไหนถ้าฉันไม่สะดุดกับสิ่งนี้
kamui

1
ว้าวเยี่ยมมาก - ฉันดึงผมออกจากปัญหานี้ ดูไฟล์ xml ของฉันเป็นร้อย ๆ ครั้งและคิดไม่ออกว่าทำไมมันถึงไม่ทำงานเหมือนไฟล์อื่น ๆ จริงๆแล้วฉันไม่มีส่วน ".hbm" ของชื่อไฟล์ ขอบคุณ!
Winger

1
คุณประหยัดเวลาของฉัน ขอบคุณ
Manjay_TBAG

4

ฉันมีปัญหาที่คล้ายกันและฉันแก้ไขมันในฐานะคน:

ฉันทำงานกับ MS SQL 2008 แต่ในการกำหนดค่า NH ฉันมีภาษาถิ่นไม่ถูกต้อง: NHibernate.Dialect MsSql2005 เลือก หากฉันแก้ไขเป็น: NHibernate เลือก MsSql2008Dialect แล้วทุกอย่างก็ทำงานได้ดีโดยไม่มีข้อยกเว้น "No persister for: ... " David.


3

ฉันยังเพิ่มแอสเซมบลีที่ไม่ถูกต้องในระหว่างการเริ่มต้น คลาสที่ฉันยังคงอยู่อยู่ในแอสเซมบลี # 1 และไฟล์. hbm.xml ของฉันถูกฝังอยู่ในแอสเซมบลี # 2 ฉันเปลี่ยนcfg.AddAssembly(...เป็นเพิ่มแอสเซมบลี # 2 (แทนแอสเซมบลี # 1) และทุกอย่างก็ใช้ได้ ขอบคุณ!


3

หากต้องการเพิ่มคำตอบของ Amol อย่าทำผิดในการระบุประเภทคลาสอินเตอร์เฟส ให้แน่ใจว่าคุณระบุระดับการดำเนินการ (เช่นอย่าใช้ IDomainObjectType) ไม่ใช่ว่าฉันทำผิดนี้ ... :)


2

ควรname="Id"หรือไม่? การพิมพ์ผิดเป็นสาเหตุที่เป็นไปได้

ต่อไปคือการลองใช้การทดสอบที่ไม่ใช่แบบทั่วไปเพื่อให้แน่ใจว่าคุณผ่านพารามิเตอร์ประเภทที่เหมาะสม

คุณสามารถโพสต์ข้อความแสดงข้อผิดพลาดทั้งหมดได้หรือไม่?



2

ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากการกำหนดค่าการแมปที่ไม่ถูกต้อง คุณควรตรวจสอบว่าคุณตั้งค่าไว้ที่ไหนการแมปสำหรับโรงงานเซสชันของคุณ โดยทั่วไปค้นหา ".Mappings (" ในโครงการของคุณและตรวจสอบให้แน่ใจว่าคุณระบุคลาสเอนทิตีที่ถูกต้องในบรรทัดด้านล่าง

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

ขอบคุณครับ! ฉันเปลี่ยนโครงการที่หน่วยงานของฉันนั่งอยู่!
viggity

1

หากรันการทดสอบบนที่เก็บจากแอสเซมบลีแยกกันตรวจสอบให้แน่ใจว่า Hibernate.cfg.xml ของคุณถูกตั้งค่าเป็นเอาต์พุตเสมอในไดเร็กทอรี bin ของแอสเซมบลีดังกล่าว สิ่งนี้ไม่ได้เกิดขึ้นกับเราและเราได้รับข้อผิดพลาดข้างต้นในบางสถานการณ์

คำเตือน: นี่อาจเป็นคำแนะนำที่ลึกลับเล็กน้อยเนื่องจากเป็นผลโดยตรงจากการที่เราจัดโครงสร้างชุดทดสอบการรวมที่เก็บของเรา (เช่นเรามีลิงก์สัญลักษณ์จากชุดทดสอบแต่ละชุดไปยัง Hibernate.xfg.xml เดียว)


1

อย่าลืมระบุข้อมูลการแมปในไฟล์. config

เช่น

โดยที่ MyApp.Data คือแอสเซมบลีที่มีการแมปของคุณ


0

มีปัญหาที่คล้ายกันเมื่อค้นหาอ็อบเจ็กต์โดย id ... สิ่งที่ฉันทำคือใช้ชื่อแบบเต็มในชื่อคลาส นั่นคือก่อนหน้านี้:

find("Class",id)

วัตถุมันจึงกลายเป็นแบบนี้:

find("assemblyName.Class",id)

0

ตรวจสอบให้แน่ใจว่าคุณได้เรียกใช้CreateCriteria(typeof(DomainObjectType))เมธอดในเซสชันสำหรับอ็อบเจ็กต์โดเมนที่คุณต้องการดึงข้อมูลจาก DB


นี่คือการคงอยู่ไม่ใช่การดึงข้อมูล
Joshua Drake

0

ฉันมีปัญหาที่คล้ายกัน แต่เป็นไปตามข้อกำหนดที่กล่าวถึงทั้งหมด ในกรณีของฉันฉันพยายามบันทึกคลาสเอนทิตีบางอย่าง (ประเภทของ OBJEKTE) กลับไปที่ DB สถานที่อื่น ๆ ทำงานได้ แต่ในกรณีนี้ล้มเหลวและยกข้อยกเว้นนี้

วิธีแก้ปัญหาของฉัน (HACK) คือการแมป objet ของประเภท OBJEKTE อีกครั้งแล้วจัดเก็บไว้ ทันใดนั้นมันได้ผล แต่อย่าถามว่าทำไม

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

หาก inparam ตรงไปที่ UpdateAsync () จะไม่พบ Persistor ที่ตรงกัน

มันสามารถอธิบายได้ด้วยวิธีที่ NH ทำเช่นนี้ ได้รับพร็อกซีจากคลาสการทำแผนที่ของคุณและใช้คุณสมบัติที่มีการจัดการสกปรกรวมอยู่ด้วย ดูนี่:

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

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

สิ่งที่น่าสนุกก็คือที่มาของinparamที่เก็บ NH นั้นเอง อย่างไรก็ตาม. ฉันอยู่กับการมอบหมายแฮ็กนี้ใหม่ในครั้งต่อไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.