NHibernate не удалось создать экземпляр прокси из-за абстрактного метода - PullRequest
3 голосов
/ 16 сентября 2010

Я новичок в NHibernate и пытаюсь отобразить модель домена, которая имеет немного наследования и т. Д. (См. этот вопрос для получения полной информации о моей модели, начиная новый вопрос, так как этодругая ошибка)

В моем базовом классе есть несколько абстрактных методов, которые каждый класс должен реализовать.Кажется, это вызывает проблемы с NHibernate, хотя я реализовал этот класс в своей модели предметной области, прокси-класс NHibernates, похоже, испытывает проблемы.

Один из таких методов - SetRequired, который недействителен в моем классе Questionи я переопределил это везде, но когда я пытаюсь проверить свои отображения, я получаю эту ошибку:

PmqccFormIntegrationTests.TestJobVelocityQuestionPersists : FailedNHibernate.HibernateException : Creating a proxy instance failed
  ----> System.TypeLoadException : Method 'SetRequired' in type 'QuestionProxy' from assembly 'QuestionProxyAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.
at NHibernate.ByteCode.LinFu.ProxyFactory.GetProxy(Object id, ISessionImplementor session)
at NHibernate.Tuple.Entity.AbstractEntityTuplizer.CreateProxy(Object id, ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.CreateProxy(Object id, ISessionImplementor session)
at NHibernate.Event.Default.DefaultLoadEventListener.CreateProxyIfNecessary(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options, IPersistenceContext persistenceContext)
at NHibernate.Event.Default.DefaultLoadEventListener.ProxyOrLoad(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options)
at NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType)
at NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType)
at NHibernate.Impl.SessionImpl.Load(String entityName, Object id)
at NHibernate.Impl.SessionImpl.Load(Type entityClass, Object id)
at PmqccDomain.DataAccess.NHibernate.AbstractNHibernateDao`2.GetById(IdT id, Boolean shouldLock) in AbstractNHibernateDao.cs: line 31
at PMQCC_IntegrationTests.PmqccFormIntegrationTests.TestJobVelocityQuestionPersists() in PmqccFormIntegrationTests.cs: line 92
--TypeLoadException
at System.Reflection.Emit.TypeBuilder.TermCreateClass(RuntimeModule module, Int32 tk, ObjectHandleOnStack type)
at System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()
at System.Reflection.Emit.TypeBuilder.CreateType()
at LinFu.DynamicProxy.ProxyFactory.CreateUncachedProxyType(Type[] baseInterfaces, Type baseType)
at LinFu.DynamicProxy.ProxyFactory.CreateProxyType(Type baseType, Type[] baseInterfaces)
at LinFu.DynamicProxy.ProxyFactory.CreateProxy(Type instanceType, IInterceptor interceptor, Type[] baseInterfaces)
at NHibernate.ByteCode.LinFu.ProxyFactory.GetProxy(Object id, ISessionImplementor session) 

Я попытался установить 'abstract = "true" в моих файлах отображенияи lazy = "false", но я все еще получаю ошибку.Мысли?

РЕДАКТИРОВАТЬ: вот мое текущее отображение

 <class name ="PmqccDomain.DomainObjects.Question,PmqccDomain" abstract="true" table="Questions">
    <id column="QuestionId" name="Id" type="Int32" unsaved-value="-1">
      <generator class="native"></generator>
    </id>
    <discriminator column="QuestionType" type="String" />
    <property name="Explanation"/>
    <many-to-one name="PmqccForm" class="PmqccDomain.DomainObjects.PmqccForm" column="PmqccFormId" />


    <!-- Subclass for Normal Question-->
    <subclass name="PmqccDomain.DomainObjects.NormalQuestion,PmqccDomain" abstract="true"  lazy="false">
      <property name="InputtedAnswer"/>

      <!-- Each Question Subclassed-->
      <subclass name="PmqccDomain.DomainObjects.AsConsQuestion,PmqccDomain" lazy="false" />
      <subclass name="PmqccDomain.DomainObjects.PiAlertQuestion,PmqccDomain" lazy="false">

        <many-to-one name="ResponsibleStaffMember" class="PmqccDomain.DomainObjects.StaffMember" column="ResponsibleStaffId" />

      </subclass>

    </subclass>

    <!-- Subclass for Job Velocity Question-->
    <subclass name="PmqccDomain.DomainObjects.JobVelocityQuestion,PmqccDomain" lazy="false">
      <property name="InputtedAnswer"/>

    </subclass>

  </class>

1 Ответ

3 голосов
/ 16 сентября 2010

Я считаю, что ключом является объявление таких методов как: protected internal abstract, поскольку это позволит прокси наследоваться от них.Вы читаете подробнее об этом здесь .

...