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