NHibernate.MickingException: Không liên tục cho: XYZ


134

Bây giờ, trước khi bạn nói: Tôi đã làm Google và hbm.xmltệp của tôi Tài nguyên được nhúng.

Đây là mã tôi đang gọi:

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

Đây là tập tin ánh xạ của tôi cho lớp:

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

Có ai chạy đến vấn đề này trước đây?

Đây là thông báo lỗi đầy đủ:

MappingException: Không liên tục cho: HQData.Objects.SubC Category] NHibernate.Impl.SessionFactoryImpl.GetEntityPersister (String entityName, Boolean throw IfNotFound)
 trong c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionFactoryImpl.cs: 766 NHibernate.Impl.SessionFactoryImpl.GetEntityPersister (String entityName)
 trong c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionFactoryImpl.cs: 752 NHibernate.Event.Default.DefaultLoadEventListener.OnLoad (sự kiện LoadEvent, LoadType loadType)
 trong c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Event \ Default \ DefaultLoadEventListener.cs: 37 NHibernate.Impl.SessionImpl.FireLoad (sự kiện LoadEvent, LoadType loadType)
 trong c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 2054 NHibernate.Impl.SessionImpl.Get (String entityName, Object id)
 trong c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 1029 NHibernate.Impl.SessionImpl.Get (Nhập thực thể, đối tượng id)
 trong c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 1020 NHibernate.Impl.SessionImpl.Get (Id đối tượng)
 trong c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 985 HQData.DataAccessUtils.NHibernateObjectHelper.LoadDataObject (Id32)
 trong C: \ Development \ HQChannelRepo \ Ứng dụng kênh HQ \ HQChannel \ HQData \ DataAccessUtils \ NHibernateObjectHelper.cs: 42 HQWebsite.LocalSearch.get_subCarget ()
 trong C: \ Development \ HQChannelRepo \ Ứng dụng kênh HQ \ HQChannel \ HQWebsite \ LocalSearch.aspx.cs: 17 HQWebsite.LocalSearch.Page_Load (Người gửi đối tượng, EventArss e)
 trong C: \ Development \ HQChannelRepo \ Ứng dụng kênh HQ \ HQChannel \ HQWebsite \ LocalSearch.aspx.cs: 27 System.Web.Util.CalliHelper.EventArgFunctionCaller (IntPtr fp, Object o, Object t, EventAr .Util.CalliEventHandlerDelegateProxy.Callback (Người gửi đối tượng, EventArss e) +33 System.Web.UI.Control.OnLoad (EventArss e) +99 System.Web.UI.Control.LoadRecursive () +47 System.Web. .ProcessRequestMain (Boolean gồmStagesB BeforeAsyncPoint, Boolean bao gồmStagesAfterAsyncPoint) +1436

Cập nhật , đây là giải pháp cho kịch bản của tôi là: Tôi đã thay đổi một số mã và tôi đã không thêm Hội vào tệp cấu hình trong thời gian chạy.


Tôi đã có cùng một lỗi, nhưng một vấn đề khác. Session.Load ("SearchItem", searchItemID) khi SearchItem trả về lỗi ánh xạ, Session.Load <SearchItem> (searchItemID) không (và là cách ít bị lỗi hơn khi thực hiện.
Kendrick

Câu trả lời:


101

Âm thanh như bạn đã quên để thêm một tập hợp ánh xạ vào cấu hình nhà máy phiên ..

Nếu bạn đang sử dụng 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
Làm thế nào để làm điều này trong Fluent NHibernate, tôi đang phát triển một mô hình trong một dự án serperate, vì vậy tôi không có quyền truy cập vào hội đồng người dùng?
Mustafa Magdy

Nếu bạn không thể tham khảo hội đồng người dùng, tôi không nghĩ bạn sẽ có thể sử dụng Fluent NHibernate.
Andy S

91

Một cái gì đó rõ ràng, nhưng khá hữu ích cho một người mới sử dụng NHibernate.

Tất cả các tệp Ánh xạ XML phải được coi là Tài nguyên được nhúng thay vì Nội dung mặc định . Tùy chọn này được đặt bằng cách chỉnh sửa thuộc tính Build Action trong thuộc tính của tệp.

Các tệp XML sau đó được nhúng vào tổ hợp và được phân tích cú pháp khi khởi động dự án trong giai đoạn cấu hình của NHibernate.


1
Haleluia, tôi có nó như một Embedded resource, nhưng khi tôi sao chép nó từ một máy tính khác, các tập tin bị mất tài sản này. Tôi gãi đầu trong vài phút.
Dragos Durlut

1
@DragosDurlut tệp dự án (.csproj) lưu thông tin của tệp dự án, chứ không phải chính tệp.
Wagner Leonardi

50

Vấn đề của tôi là tôi đã quên đặt .hbm vào tên của xml ánh xạ. Cũng đảm bảo rằng bạn làm cho nó một tài nguyên nhúng!


1
Đó cũng là sai lầm của tôi!
Gringo

Đây cũng là vấn đề của tôi, gặp lỗi tương tự như trong Q khi thực hiện get. Khi cố gắng truy vấn tất cả các đối tượng của loại đó, không có lỗi, chỉ là một tập kết quả trống!
Christoph

Arg - quên .hbm quá. Cảm ơn!
Bác sĩ C. Hilarius

42

Tôi đã nhận ra điều này ở đây :

Trong trường hợp của tôi, lớp ánh xạ không công khai. Nói cách khác, thay vì:

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

Tôi vừa có:

class UserMap : ClassMap<user>

Cảm ơn, bạn vừa cứu tôi khỏi một chút đau đầu. :)
Rytmis

2
Nếu bạn đang sử dụng Fluent, tôi muốn nói rằng đây sẽ là nguyên nhân phổ biến hơn. Cảm ơn, đó là rất dễ bỏ lỡ.
Richard Neil Ilagan

1
Cảm ơn! Khi kiểm tra xem tôi có công khai các lớp ánh xạ của mình hay không, tôi phát hiện ra tôi đã không viết một lớp ánh xạ cho thực thể này - rất tiếc !! :) Tiết kiệm cho tôi rất nhiều thời gian !!
Jen

28

Dành khoảng 4 giờ để googlingstackoverflowing , thử tất cả mọi thứ xung quanh đó, tôi đã tìm thấy lỗi của mình:

Tập tin bản đồ của tôi được gọi .nbm.xml thay vì .hbm.xml . Điều đó thật điên rồ.


9
Argh, chỉ cần làm như vậy ngoại trừ tôi đã có nó như .xml thay vì .hbm.xml. Có lẽ nên có một số gợi ý trong các lỗi :)
Rezler

2
Chúa ơi. Tôi không thể tin rằng tôi đã làm điều này. Tôi đã tìm kiếm hàng giờ trong các tập tin ánh xạ cho các lỗi và hóa ra tôi đã mắc lỗi đánh máy trong tên tệp ... doh. Cảm ơn bạn! Tôi rùng mình khi nghĩ mình sẽ xé tóc trong bao lâu nếu không vấp phải chuyện này.
kamui

1
Wow, bắt tuyệt vời - Tôi đã kéo tóc ra về vấn đề này. Đã xem qua tệp xml của tôi hàng trăm lần và không thể hiểu tại sao nó không hoạt động như những người khác. Tôi thực sự đã thiếu phần ".hbm" của tên tệp. Cảm ơn!
Cầu thủ chạy cánh

Bạn đã tiết kiệm giờ của tôi. Cảm ơn
Manjay_TBAG

4

Tôi đã có vấn đề tương tự, và tôi đã giải quyết nó như mọi người:

Tôi làm việc trên MS SQL 2008, nhưng trong cấu hình NH tôi có phương ngữ xấu: NHibernate.Dialect. MsSql2005Dialect nếu tôi sửa nó thành: NHibernate.Dialect. MsSql2008Dialect sau đó mọi thứ đều hoạt động tốt mà không có ngoại lệ "Không có gì khó chịu cho: ..." David.


3

Tôi cũng đã thêm lắp ráp sai trong quá trình khởi tạo. Lớp tôi đang tồn tại nằm ở cụm số 1 và tệp .hbm.xml của tôi được nhúng vào cụm số 2. Tôi đã thay đổi cfg.AddAssembly(...để thêm cụm số 2 (thay vì lắp ráp số 1) và mọi thứ đều hoạt động. Cảm ơn!


3

Để thêm vào câu trả lời của Amol, đừng phạm sai lầm khi chỉ định loại lớp Giao diện. Hãy chắc chắn rằng bạn chỉ định lớp thực hiện . (Tức là không sử dụng IDomainObjectType). Không phải tôi đã phạm sai lầm này ... :)


2

Có nên name="Id"không? Typose là một nguyên nhân có thể.

Tiếp theo sẽ là thử nó với một bài kiểm tra không chung chung để đảm bảo bạn chuyển qua tham số loại thích hợp.

Bạn có thể gửi toàn bộ thông báo lỗi?



2

Lỗi này xảy ra do cấu hình ánh xạ không hợp lệ. Bạn nên kiểm tra nơi bạn đặt .Mappings cho nhà máy phiên của bạn. Về cơ bản tìm kiếm ".Mappings (" trong dự án của bạn và đảm bảo bạn đã chỉ định lớp thực thể chính xác trong dòng dưới đây.

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

cảm ơn anh bạn Tôi chuyển dự án mà các thực thể của tôi đang ngồi!
viggity

1

Nếu đang chạy thử nghiệm trên kho lưu trữ từ một cụm riêng biệt, thì hãy đảm bảo Hibernate.cfg.xml của bạn được đặt thành đầu ra luôn trong thư mục bin của lắp ráp đã nói. Điều này đã không xảy ra với chúng tôi và chúng tôi đã nhận được lỗi trên trong một số trường hợp.

Tuyên bố miễn trừ trách nhiệm: Đây có thể là một lời khuyên hơi bí truyền, cho rằng đó là kết quả trực tiếp của cách chúng tôi cấu trúc các cụm kiểm thử tích hợp kho lưu trữ của chúng tôi (nghĩa là chúng tôi có một liên kết tượng trưng từ mỗi hội đồng kiểm tra đến một Hibernate.xfg.xml)


1

Đừng quên chỉ định thông tin ánh xạ trong tệp .config

ví dụ

MyApp.Data là nơi lắp ráp có chứa ánh xạ của bạn


0

Có một vấn đề tương tự khi tìm một đối tượng theo id ... Tất cả những gì tôi đã làm là sử dụng tên đủ điều kiện trong tên lớp. Đó là Trước khi nó là:

find("Class",id)

Đối tượng vì vậy nó trở thành như thế này:

find("assemblyName.Class",id)

0

Hãy chắc chắn rằng bạn đã gọi CreateCriteria(typeof(DomainObjectType))phương thức trên Phiên cho đối tượng miền mà bạn định tìm nạp từ DB.


Đây là một bền bỉ, không phải là một tìm nạp.
Joshua Drake

0

Tôi có một vấn đề tương tự nhưng tất cả các yêu cầu được đề cập đều được đáp ứng. Trong trường hợp của tôi, tôi cố gắng lưu một số lớp thực thể (Loại OBJEKTE) trở lại DB. Những nơi khác làm việc nhưng chỉ trong trường hợp này nó thất bại và làm tăng ngoại lệ này.

Giải pháp của tôi (HACK) là lập lại bản đồ objet của loại OBJEKTE và lưu trữ nó sau đó. Đột nhiên nó hoạt động. Nhưng đừng hỏi tại sao.

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

Nếu inparam sẽ đi thẳng đến UpdateAsync () thì nó không thể tìm thấy một điện trở phù hợp.

Nó có thể được giải thích bằng cách NH làm điều này. Nó nhận được một proxy từ lớp ánh xạ của bạn và thực hiện các thuộc tính với xử lý bẩn đi kèm. Xem cái này:

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

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

Mặc dù vậy, điều thú vị là nguồn của inparamthực tế là kho NH. Dù sao đi nữa. Tôi ở lại với bản hack gán lại này cho lần tiếp theo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.