2010-06-10 2 views
0

Я разработчик новичку ....Наследование - не удалось инициализировать прокси - не сессии

я действительно нужна помощь в сейчас ... я просто начать с NHibernate вещь на .Net ... когда я узнаю Наследование и попробую ... это заставляет меня сбивать с толку ... почему я получаю такую ​​ошибку:

Инициализация [AP.Core.Domain.AccountPayable.APInvoice # API03/04/2010/001] -Could не инициализировать прокси - нет сеанса.

это мой XML:

<class xmlns="urn:nhibernate-mapping-2.2" mutable="true" name="AP.Core.Domain.AccountPayable.APAdjustment, AP.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="APAdjustment"> 
    <id name="AdjustmentNumber" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="AdjustmentNumber" length="17" /> 
     <generator class="assigned" /> 
    </id> 
    <property name="Amount" type="System.Decimal, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Amount" /> 
    </property> 
    <property name="TransactionDate" type="System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="TransactionDate" /> 
    </property> 
    <many-to-one class="AP.Core.Domain.AccountPayable.APInvoice, AP.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" lazy="proxy" name="PurchaseInvoice"> 
     <column name="PurchaseInvoice_id" not-null="true" /> 
    </many-to-one> 
    <joined-subclass name="AP.Core.Domain.AccountPayable.APCreditAdjustment, AP.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" lazy="true" table="APCreditAdjustment"> 
     <key> 
     <column name="APAdjustment_id" /> 
     </key> 
    </joined-subclass> 
    </class> 
</hibernate-mapping> 

и это наследование классов:

Родитель Класс ->

public class APAdjustment 
     { 
     #region :FIELD 
     private string adjustmentNumber; 
     private decimal amount; 
     private DateTime transactionDate; 
     private APInvoice purchaseInvoice; 

Детский класс ->

public class APCreditAdjustment : APAdjustment { 

    public APCreditAdjustment(){ 

и это мой доступ к данным:

public IList<APAdjustment> GetByNameAll() 
{ 
    ICriteria criteria = Nhibernatesession.CreateCriteria(typeof(APAdjustment)); 
    return criteria.List<APAdjustment>() ; 
} 

Моей проблема:

  1. , когда я загрузить данные с GridView ... это работает ... но я изменить свойство autogenerate = "true" ... i missing Поле "PurchaseInvoice" ... и i изменить для привязки вручную, и это works..when я редактирую это gridview ... я получаю это ошибка ...

    Инициализация [AP.Core.Domain.AccountPayable.APInvoice # API03/04/2010/001] Не могли бы не инициализировать прокси - не сессии

  2. так, то я изменить XML ... lazy = "no-proxy" ... это все еще Работа ... но когда редактирование снова ... я получаю ошибка снова .. и я делаю "Комментарий из выбранных строк" в мою ассоциацию " Много-к-одному «... я действительно работает ... но это не я хочу ...

МОЖЕТ НИКТО ПОМОГИТЕ МНЕ ... ?? плизз ... :(

Примечание: Я почти забыл его, я использую свободно спящий режим для создания в database.From беглом Hibernate ..Я поместить файл * .xml. ..so я работаю с xml NHibernate ... не беглый спящий предмет ... :)

+0

Интересно, какой образец/документ вы используете, чтобы узнать NH. У карт есть вещи, которые можно улучшить. NH использует свойства, и они должны быть виртуальными, потому что NH создает их прокси. Я предлагаю вам поставить полный код (а не только часть), и он увидит. – Marcote

+0

Прошу прощения ... я забыл рассказать вам ... весь мой код стал виртуальной собственностью ... без виртуального ... мой код не может работать ... это часть моего кода: public virtual string AdjustmentNumber { get {return adjustmentNumber; } set {adjustNumber = value; } } общедоступный виртуальный decimal Сумма { get {сумма возврата; } set {amount = value; } } public virtual DateTime TransactionDate { get {return transactionDate; } set {transactionDate = значение; } } общедоступный виртуальный APInvoice PurchaseInvoice { get {return purchaseInvoice; } set {purchaseInvoice = value; } } – Ninu

+0

Как работает ваша обработка сеансов - это происходит нормально, если NHibernate пытается ленить загрузить свойство, и сеанс ушел. Поэтому, пожалуйста, дайте нам дополнительную информацию о Nhibernatesession – bernhardrusch

ответ

0

Во всех ваших ассоциациях, положить это в вашем коде:

не обретенной = «игнорировать»

+0

Это сработало! Но почему?? – Cognitronic

+0

Не только плохой и сомнительный ответ, предоставленный случайным образом, вы не предоставили никакой информации о том, что это делает. Дополнительную информацию смотрите здесь: http://stackoverflow.com/questions/13726668/nhibernate-force-not-found-ignore-to-not-execute-an-extra-select – wegginho

0

Это исключение обычно означает, что вы пытаетесь получить доступ к ленивой загрузке, когда сессия закрыта (я вижу lazy="proxy" в файле сопоставления). Я предлагаю вам поставить точку останова перед доступом к свойству «PurchaseInvoice» и проверить свой Session.IsOpen на сеанс, к которому принадлежит ваш экземпляр APAdjustment.

+0

Да ... похоже, что моя сессия равна нулю ... как я могу ее исправить? Мне нравится это ... ISession session = null; Критерии ICriteria = null; Boolean _check = NHibernateSession.IsOpen; try { session = NHibernateSession.SessionFactory.GetCurrentSession(); Критерии = NHibernateSession.CreateCriteria (TypeOf (APAdjustment)); } catch (HibernateException ex) { log.Error (ex.GetBaseException()); } или что-то не так в моем коде ??? – Ninu

0

Если сеанс нулевой, вы столкнулись с совершенно другой проблемой (вы не смогли получить предыдущую ошибку, если ваш сеанс был нулевым, я считаю, что вы что-то изменили в своем коде) Для управления сеансом требуется сеанс менеджер и класс контекста сеанса (см. nHibernate doc here) Я предлагаю вам немного упростить свой дизайн и не вводить диспетчер сеансов, пока вы не поняли импликации (хотя диспетчер сеансов это настоятельно рекомендуется для многих проекты). Просто откройте новый сеанс, как

ISession session = YouSessionFactory.OpenSession() 
ICriteria criteria = session.CreateCriteria(typeof(APAdjustment)); 

и идите вперед, чтобы избавиться от SessionManager (только для целей тестирования). Если вы используете отложенную загрузку, сессия должна быть открыта, когда ваш доступ к ленивой заряженной собственности, вероятно, ваш менеджер сеансов не работает, как вы ожидаете

С уважением, Марко

Смежные вопросы