NHibernate.MappingException: XYZ için kalıcı değil


134

Şimdi, bunu söylemeden önce: ben yaptım Google'ı ve benim hbm.xmldosya olan bir Gömülü Kaynak.

İşte ben kod arıyorum:

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

İşte sınıf için eşleme dosyası:

<?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>

Bu konuya daha önce kimse koştu mu?

İşte tam hata mesajı:

MappingException: Şunun için persister yok: HQData.Objects.SubCategory] NHibernate.Impl.SessionFactoryImpl.GetEntityPersister (Dize varlıkAdı, Boole throwIfNotFound)
 c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionFactoryImpl.cs: 766 NHibernate.Impl.SessionFactoryImpl.GetEntityPersister (Dize varlıkAdı)
 c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionFactoryImpl.cs: 752 NHibernate.Event.Default.DefaultLoadEventListener.OnLoad (LoadEvent olayı, LoadType loadType)
 c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Event \ Default \ DefaultLoadEventListener.cs: 37 NHibernate.Impl.SessionImpl.FireLoad (LoadEvent olayı, LoadType loadType)
 c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 2054 NHibernate.Impl.SessionImpl.Get (Dize varlıkAdı, Nesne kimliği)
 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 (Nesne kimliği)
 c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 985 HQData.DataAccessUtils.NHibernateObjectHelper.LoadDataObject (Int32 Kimliği)
 C: \ Development \ HQChannelRepo \ HQ Kanal Uygulaması \ HQChannel \ HQData \ DataAccessUtils \ NHibernateObjectHelper.cs: 42 HQWebsite.LocalSearch.get_subCategory ()
 C: \ Development \ HQChannelRepo \ HQ Kanal Uygulaması \ HQChannel \ HQWebsite \ LocalSearch.aspx.cs: 17 HQWebsite.LocalSearch.Page_Load (Nesne göndericisi, EventArgs e)
 C: \ Development \ HQChannelRepo \ HQ Kanal Uygulaması \ 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 (Nesne göndericisi, EventArgs e) +33 System.Web.UI.Control.OnLoad (EventArgs e) +99 System.Web.UI.Control.LoadRecursive () +47 System.Web.UI.Page .ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Bool include includeStagesAfterAsyncPoint) +1436.

Güncelleme , benim senaryo için çözüm şuydu: Bazı kodu değiştirmiştim ve çalışma zamanı sırasında Meclis'i config dosyasına eklemedim.


Aynı hatayla karşılaştım, ama farklı bir sorun. SearchItem bir eşleme hatası, Session.Load <SearchItem> (searchItemID) döndürür olarak Session.Load ( "SearchItem", searchItemID) değil (ve yine bunu yapmanın daha az hata eğilimli bir yoldur.
Kendrick

Yanıtlar:


101

Oturum fabrika yapılandırmasına bir eşleme montajı eklemeyi unuttuğunuz gibi görünüyor.

App.config kullanıyorsanız ...

.
.
    <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
Nasıl Akıcı NHibernate yapmak, ben serperate bir projede bir desen geliştiriyorum, bu yüzden kullanıcı montaj erişimi yok?
Mustafa Magdy

Kullanıcı derlemesine başvuramazsanız, Fluent NHibernate'i kullanabileceğinizi sanmıyorum.
Andy S

91

NHibernate'de yeni olanlar için bariz ama yine de oldukça faydalı bir şey.

Tüm XML Eşleme dosyaları , varsayılan İçerik yerine Gömülü Kaynaklar olarak ele alınmalıdır . Bu seçenek, dosyanın özelliklerinde Build Action özniteliği düzenlenerek ayarlanır.

XML dosyaları daha sonra derlemeye katılır ve NHibernate'in yapılandırma aşamasında proje başlangıcında ayrıştırılır.


1
Haleluia, ben bir olarak var Embedded resource, ama bir bilgisayardan diğerine kopyaladığımda, dosya bu özelliği kaybetti. Birkaç dakikalığına başımı kaşıdım.
Dragos Durlut

1
@DragosDosyayı değil proje dosyalarının bilgilerini kaydeden proje dosyasını (.csproj) bulun.
Wagner Leonardi

50

Benim sorunum eşleme xml adına .hbm koymak unuttum oldu. Ayrıca gömülü bir kaynak yaptığınızdan emin olun!


1
Bu da benim hatamdı!
Gringo

Bu da benim sorunum oldu, get yaparken Q ile aynı hatayı alın. Bu türdeki tüm nesneleri sorgulamaya çalışırken, hata yok, sadece boş bir sonuç kümesi!
Christoph

Arg - .hbm'yi de unuttu. Teşekkürler!
Dr.C. Hilarius

42

Bunu buradan aldım :

Benim durumumda haritalandırma sınıfı herkese açık değildi. Başka bir deyişle, yerine:

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

Ben sadece:

class UserMap : ClassMap<user>

Teşekkürler, beni biraz baş ağrısından kurtardın. :)
Rytmis

2
Fluent kullanıyorsanız, bunun daha yaygın neden olacağını söyleyebilirim. Teşekkürler, kaçırmak çok kolaydı.
Richard Neil Ilagan

1
Teşekkürler! Haritalama derslerimi herkese açık hale getirip getirmediğimi kontrol edeceğim, bu varlık için bir haritalama sınıfı yazmamış olduğumu keşfettim! :) Zaman biriktirdi beni !!
Jen

28

Googling ve stackoverflowing üzerinde yaklaşık 4 saat harcamak , orada her şeyi denemek, benim hata buldum:

Eşleme dosyama .hbm.xml yerine .nbm.xml adı verildi . Bu delilikti.


9
Argh, sadece aynı .hbm.xml yerine .xml vardı dışında yaptım. Belki hatalarda bazı ipuçları olmalı :)
Rezler

2
Aman Tanrım. Bunu yaptığıma inanamıyorum. Dosyaları eşlemede saatlerce arıyordum ve dosya adında bir yazım hatası yaptığım ortaya çıktı ... doh. Teşekkür ederim! Eğer tökezlememiş olsaydım saçlarımı ne kadar uzun süre yırtabileceğimi düşünmek için ürperdim.
kamui

1
Vay canına, harika yakalama - saçımı bu soruna çekiyordum. Yüzlerce kez xml dosyama baktı ve neden diğerleri gibi çalışmadığını anlayamadım. Aslında dosya adının ".hbm" kısmı eksikti. Teşekkürler!
Winger

Saatlerimi kurtardın. Teşekkürler
Manjay_TBAG

4

Benzer bir sorunum vardı ve bunu folow olarak çözdüm:

MS SQL 2008 üzerinde çalışıyorum, ancak NH yapılandırmasında kötü lehçe vardı: NHibernate.Dialect. MsSql2005Dialect : Bunu düzeltirsem: NHibernate.Dialect. MsSql2008Dialect o zaman istisnasız her şey iyi çalışıyor "için sebat yok: ..." David.


3

Başlatma sırasında da yanlış montaj ekledim. Devam ettiğim sınıf 1 numaralı montajda ve .hbm.xml dosyam 2 numaralı montajda gömülü. cfg.AddAssembly(...2 numaralı montajı (1 numaralı montaj yerine) eklemek için değiştirdim ve her şey çalıştı. Teşekkürler!


3

Amol'un cevabına eklemek için Interface sınıf tipini belirleme hatası yapmayın. Uygulama sınıfını belirttiğinizden emin olun . (Yani. IDomainObjectType kullanmayın). Bu hatayı yaptığımdan değil ... :)


2

Olmalı mı name="Id"? Yazım hataları olası bir nedendir.

Daha sonra, uygun tip parametresini geçtiğinizden emin olmak için genel olmayan bir testle denemek olacaktır.

Tüm hata mesajını gönderebilir misiniz?



2

Bu hata, geçersiz eşleme yapılandırması nedeniyle oluşur. Nerede ayarladığınızı kontrol etmelisiniz. Oturum fabrikanız için uygulamalar. Temel olarak projenizde ".Mappings (") arayın ve aşağıdaki satırda doğru varlık sınıfını belirttiğinizden emin olun.

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

Tesekkurler dostum! Varlıklarımın oturduğu projeyi değiştirdim!
viggity

1

Depo üzerinde ayrı bir derlemeden sınama çalıştırıyorsanız, Hibernate.cfg.xml dosyanızın söz konusu derlemenin bin dizininde her zaman çıktı olarak ayarlandığından emin olun. Bu bizim için olmadı ve bazı durumlarda yukarıdaki hatayı aldık.

Feragatname: Havuz entegrasyon testi montajlarımızı nasıl yapılandırdığımızın doğrudan bir sonucu olduğu için bu biraz ezoterik bir tavsiye olabilir (yani her test montajından tek bir Hibernate.xfg.xml'ye sembolik bir bağımız vardır)


1

.Config dosyasında eşleme bilgilerini belirtmeyi unutmayın

Örneğin

MyApp.Data, eşlemelerinizi içeren bir derleme


0

Kimliğe göre bir nesne bulurken de benzer bir sorun yaşadım ... Tüm yaptığım sınıf adında tam nitelendirilmiş adı kullanmaktı. Oldu önce:

find("Class",id)

Nesne böylece şöyle oldu:

find("assemblyName.Class",id)

0

CreateCriteria(typeof(DomainObjectType))DB'den getirmek istediğiniz etki alanı nesnesi için Session yöntemini çağırdığınızdan emin olun .


Bu bir sürekliliktir, getirme değil.
Joshua Drake

0

Benzer bir sorunum var, ancak belirtilen tüm gereksinimler karşılandı. Benim durumumda, bazı varlık sınıfını (OBJEKTE Tipi) DB'ye kaydetmeye çalışıyorum. Diğer yerler işe yarıyor ama sadece bu durumda başarısız oluyor ve bu istisnayı gündeme getiriyor.

Benim çözümüm (HACK), OBJEKTE türünün nesnesini yeniden eşlemek ve daha sonra saklamaktı. Aniden çalışıyor. Ama nedenini sorma.

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

Inparam doğrudan UpdateAsync () 'e giderse, eşleşen bir direnç bulamaz.

NH'nin bunu yapmasıyla açıklanabilir. Eşleme sınıfınızdan bir proxy türetir ve kirli işleme dahil özellikleri uygular. Bunu gör:

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

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

Eğlenceli olan şey, kaynağının inparamaslında NH deposunun kendisi olmasıdır. Neyse. Bir dahaki sefere bu yeniden kesmek kesmek ile kal.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.