Hola a todos,

Antes de empezar, quería felicitarlos por este gran grupo. Estoy
teniendo problemas con la estrategia Table per class hierarchy. Tengo
la siguiente estructura:

ElectronicAddress (Clase base y tambien nombre de la tabla en la DB)
    WebSite(Clase heredada)
    Email(Clase heredada)

Dentro de la tabla en la DB, hay un campo llamado
ElectronicAddressType el cual es el discriminador. El mapping para
estas clases clases trabajan correctamente puesto que logro persistir
datos perfectamente(ya sea un WebSite o un Email).

El problema lo tengo con una asociación. Hay otra tabla, Customer, la
cual se relaciona con la tabla ElectronicAddress. Cuando recupero un
Customer, esta operacion lo hace bien, pero cuando intento acceder a
la colección WebSites, por ejemplo, se lanza la siguiente excepción:

EXCEPTION
===================================================================
NHibernate.WrongClassException was unhandled
  Message=Object with id: 8a7a98b0-ba4d-4cee-99bc-8c4c8a1665f0 was not
of the specified subclass: MyProyect.Model.Entities.ElectronicAddress
(Discriminator was: 'WB ')
  Source=NHibernate
  EntityName=MyProyect.Model.Entities.ElectronicAddress
  StackTrace:
       en NHibernate.Loader.Loader.GetInstanceClass(IDataReader rs,
Int32 i, ILoadable persister, Object id, ISessionImplementor session)
en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:línea
1035
       en NHibernate.Loader.Loader.InstanceNotYetLoaded(IDataReader
dr, Int32 i, ILoadable persister, EntityKey key, LockMode lockMode,
String rowIdAlias, EntityKey optionalObjectKey, Object optionalObject,
IList hydratedObjects, ISessionImplementor session) en d:\CSharp\NH\NH
\nhibernate\src\NHibernate\Loader\Loader.cs:línea 928
       en NHibernate.Loader.Loader.GetRow(IDataReader rs, ILoadable[]
persisters, EntityKey[] keys, Object optionalObject, EntityKey
optionalObjectKey, LockMode[] lockModes, IList hydratedObjects,
ISessionImplementor session) en d:\CSharp\NH\NH\nhibernate\src
\NHibernate\Loader\Loader.cs:línea 878
       en NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader
resultSet, ISessionImplementor session, QueryParameters
queryParameters, LockMode[] lockModeArray, EntityKey
optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean
returnProxies) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader
\Loader.cs:línea 334
       en NHibernate.Loader.Loader.DoQuery(ISessionImplementor
session, QueryParameters queryParameters, Boolean returnProxies) en d:
\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:línea 465
       en
NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor
session, QueryParameters queryParameters, Boolean returnProxies) en d:
\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:línea 243
       en NHibernate.Loader.Loader.LoadCollection(ISessionImplementor
session, Object id, IType type) en d:\CSharp\NH\NH\nhibernate\src
\NHibernate\Loader\Loader.cs:línea 1505
       en
NHibernate.Loader.Collection.CollectionLoader.Initialize(Object id,
ISessionImplementor session) en d:\CSharp\NH\NH\nhibernate\src
\NHibernate\Loader\Collection\CollectionLoader.cs:línea 35
       en
NHibernate.Persister.Collection.AbstractCollectionPersister.Initialize(Object
key, ISessionImplementor session) en d:\CSharp\NH\NH\nhibernate\src
\NHibernate\Persister\Collection\AbstractCollectionPersister.cs:línea
578
       en
NHibernate.Event.Default.DefaultInitializeCollectionEventListener.OnInitializeCollection(InitializeCollectionEvent
event) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default
\DefaultInitializeCollectionEventListener.cs:línea 51
       en
NHibernate.Impl.SessionImpl.InitializeCollection(IPersistentCollection
collection, Boolean writing) en d:\CSharp\NH\NH\nhibernate\src
\NHibernate\Impl\SessionImpl.cs:línea 1590
       en
NHibernate.Collection.AbstractPersistentCollection.Initialize(Boolean
writing) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Collection
\AbstractPersistentCollection.cs:línea 463
       en NHibernate.Collection.AbstractPersistentCollection.Read() en
d:\CSharp\NH\NH\nhibernate\src\NHibernate\Collection
\AbstractPersistentCollection.cs:línea 262
       en
NHibernate.Collection.Generic.PersistentGenericSet`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Collection\Generic
\PersistentGenericSet.cs:línea 229
       en MyProyect.Testing.ConsoleApp.Program.GetPerson(Guid id) en D:
\DevSystem\Business Projects\eTarquini\Projects\MyProject
\MyProject.Testing.ConsoleApp\Program.cs:línea 101
       en MyProject.Testing.ConsoleApp.Program.CreateSocialNetwork()
en D:\DevSystem\Business Projects\eTarquini\Projects\MyProject
\MyProject.Testing.ConsoleApp\Program.cs:línea 87
       en MyProject.Testing.ConsoleApp.Program.Main(String[] args) en
D:\DevSystem\Business Projects\eTarquini\Projects\MyProject
\MyProject.Testing.ConsoleApp\Program.cs:línea 17
       en System.AppDomain._nExecuteAssembly(Assembly assembly,
String[] args)
       en System.AppDomain.ExecuteAssembly(String assemblyFile,
Evidence assemblySecurity, String[] args)
       en
Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       en System.Threading.ThreadHelper.ThreadStart_Context(Object
state)
       en System.Threading.ExecutionContext.Run(ExecutionContext
executionContext, ContextCallback callback, Object state)
       en System.Threading.ThreadHelper.ThreadStart()
  InnerException:
===================================================================

El Mapping para ElectronicAddress

MAPPING: ElectronicAddress.hbm.xml
===================================================================
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping namespace="MyProject.Model.Entities"
assembly="MyProject.Model" xmlns="urn:nhibernate-mapping-2.2">
  <class name="ElectronicAddress" table="ElectronicAddress"
schema="dbo">
    <id name="Id" type="Guid" column="Id" access="property">
      <generator class="guid"/>
    </id>

    <discriminator column="ElectronicAddressType" type="String" />

    <many-to-one name="Customer" class="Customer" column="Customer_Id"
not-null="true" fetch="select" />

    <subclass name="WebSite" discriminator-value="WB">
      <property name="Description" column="Description" type="String" /
>
      <property name="IsPrimaryResource" column="IsPrimaryResource"
type="Boolean" />
      <property name="UrlAddress" column="Name" type="String" />
    </subclass>

    <subclass name="Email" discriminator-value="EA">
      <property name="Description" column="Description" type="String" /
>
      <property name="IsPrimaryResource" column="IsPrimaryResource"
type="Boolean" />
      <property name="EmailAddress" column="Name" type="String" />
    </subclass>

    <subclass name="SocialNetwork" discriminator-value="SN">
      <property name="Description" column="Description" type="String" /
>
      <property name="IsPrimaryResource" column="IsPrimaryResource"
type="Boolean" />
      <property name="SocialNetworkAddress" column="Name"
type="String" />
    </subclass>

  </class>
</hibernate-mapping>
===================================================================


El Mapping para Customer

MAPPING: Customer.hbm.xml
===================================================================
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping namespace="MyProject.Model.Entities"
assembly="MyProject.Model" xmlns="urn:nhibernate-mapping-2.2">
  <class name="Customer" table="Customer" schema="dbo">
    <id name="Id" column="Id" access="property">
      <generator class="guid" />
    </id>

    <property name="CreatedDate" type="DateTime"
column="`CreatedDate`" />
    <property name="CreatedUser" type="String" column="`CreatedUser`"
length="25" />
    <property name="DocumentNumber" type="String"
column="`DocumentNumber`" length="15" />
    <property name="ModifiedDate" type="DateTime"
column="`ModifiedDate`" />
    <property name="ModifiedUser" type="String"
column="`ModifiedUser`" length="25" />
    <property name="Name" type="String" column="`Name`" length="125" /
>
    <property name="CustomerType" type="String"
column="`CustomerType`" length="2" />
    <property name="State" type="String" column="`State`" length="1" /
>
    <property name="ExternalEntityId" type="Guid"
column="`ExternalEntityId`" />

    <set name="WebSites" inverse="true">
      <key column="`Customer_Id`" />
      <one-to-many class="ElectronicAddress" />
    </set>

  </class>
</hibernate-mapping>
===================================================================

Dentro de la clase Customer tengo la siguiente propiedadad:

        public virtual Iesi.Collections.Generic.ISet<WebSite> WebSites
        {
            get;
            set;
        }

Espero alguien me pueda orientar.


Muchas gracias de antemano.

-- 
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano

Responder a