Out of my head, I cannot say whether it is an AR or NH bug. Usage
seems ok. Workaround is using the Where-property as shown below.
Please open a Donjon-issue on this.
-Markus
[HasMany(typeof(Photo), Table="Image", ColumnKey="CountryId",
Inverse=true,
Cascade=ManyRelationCascadeEnum.AllDeleteOrphan,
Where="ImageType='Photo'"
)]
public IList<Photo> PhotoList
{
get { return m_photoList; }
set { m_photoList = value; }
}
[HasMany(typeof(Map), Table="Image", ColumnKey="CountryId",
Inverse=true,
Cascade=ManyRelationCascadeEnum.AllDeleteOrphan,
Where="ImageType='Map'"
)]
public IList<Map> MapList
{
get { return m_mapList; }
set { m_mapList = value; }
}
2009/6/3 Thi <[email protected]>:
>
> Here's the draft. I've got the following classes:
> -Country
> -Image (Single Table Inheritance)
> -Map
> -Photo
>
> Statements:
> Map and Photo inherit from Image.
> A Country can have as many Photos as possible.
> A Country can have as many Maps as possible.
>
> Situation:
> The database is populated with plenty countries to test with, no maps,
> no photos. I can add, remove, edit Photos and Maps as I please.
>
> Issue / Problem:
> Upon adding a new Map object to the database everything works as
> expected, the record is inserted, etc. When I try to load a Country
> object that has a Map associated with it, it crashes because it's
> trying to cast a Map record into the Photo collection (Upon examining
> the SQL statement, it's not including the discriminator so it's
> loading all records)
>
> Here are the classes (at least the interesting part):
>
> --- Country.cs
>
> [ActiveRecord]
> public class Country : ActiveRecordBase<Country>
> {
> // Omitted for clarity
> private int m_ID;
> private IList<Photo> m_photoList = new List<Photo>();
> private IList<Map> m_mapList = new List<Map>();
>
> [PrimaryKey(PrimaryKeyType.Native,
> Access=PropertyAccess.NosetterPascalcaseMUndersc)]
> public int ID
> {
> get { return m_ID; }
> }
>
> [HasMany(typeof(Photo), Table="Image", ColumnKey="CountryId",
> Inverse=true,
> Cascade=ManyRelationCascadeEnum.AllDeleteOrphan)]
> public IList<Photo> PhotoList
> {
> get { return m_photoList; }
> set { m_photoList = value; }
> }
>
> [HasMany(typeof(Map), Table="Image", ColumnKey="CountryId",
> Inverse=true,
> Cascade=ManyRelationCascadeEnum.AllDeleteOrphan)]
> public IList<Map> MapList
> {
> get { return m_mapList; }
> set { m_mapList = value; }
> }
> }
>
> --- Image.cs
>
> [ActiveRecord(DiscriminatorColumn="ImageType",
> DiscriminatorType="String", DiscriminatorValue="Image")]
> public class Image : ActiveRecordBase<Image>
> {
> [BelongsTo("CountryId")]
> public Country Country
> {
> get { return m_country; }
> set { m_country = value; }
> }
> }
>
> --- Photo.cs
>
> [ActiveRecord(DiscriminatorValue="Photo")]
> public class Photo : Image
> {
> public Photo() : base()
> {
> // Empty
> }
>
> public Photo(string imgName, string imgDescription, Country
> imgCountry, string imgUrl)
> : base(imgName, imgDescription, imgCountry, imgUrl)
> {
> // Empty
> }
>
> --- Map.cs
>
> [ActiveRecord(DiscriminatorColumn="ImageType",
> DiscriminatorType="String", DiscriminatorValue="Map")]
> public class Map : Image
> {
> // No custom variables yet
>
> public Map() : base()
> {
> // Empty
> }
>
> public Map(string imgName, string imgDescription, Country
> imgCountry, string imgUrl) : base(imgName, imgDescription, imgCountry,
> imgUrl)
> {
> // Empty
> }
> }
>
> --- SQL Executed to get the Photo Collection
> NHibernate: SELECT maplist0_.CountryId as CountryId__1_, maplist0_.ID
> as ID1_, m
> aplist0_.ID as ID3_0_, maplist0_.Name as Name3_0_,
> maplist0_.Description as Desc
> ript4_3_0_, maplist0_.URL as URL3_0_, maplist0_.CountryId as
> CountryId3_0_ FROM
> Image maplist0_ WHERE maplist0_.country...@p0; @p0 = '31'
>
> --- SQL Executed to get the Map Collection
> NHibernate: SELECT photolist0_.CountryId as CountryId__1_,
> photolist0_.ID as ID1
> _, photolist0_.ID as ID3_0_, photolist0_.Name as Name3_0_,
> photolist0_.Descripti
> on as Descript4_3_0_, photolist0_.URL as URL3_0_,
> photolist0_.CountryId as Count
> ryId3_0_ FROM Image photolist0_ WHERE photolist0_.country...@p0; @p0 =
> '31'
>
> As you can see it doesn't include the Discriminator in the query, no
> idea why, otherwise it would work.
>
> --- Exception
> A first chance exception of type
> 'Castle.ActiveRecord.Framework.ActiveRecordException' occurred in
> Castle.ActiveRecord.dll
> System.Transactions Critical: 0 : <TraceRecord xmlns="http://
> schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord"
> Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/
> TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/
> Unhandled</TraceIdentifier><Description>Unhandled exception</
> Description><AppDomain>ConsoleApp.vshost.exe</
> AppDomain><Exception><ExceptionType>Castle.ActiveRecord.Framework.ActiveRecordException,
> Castle.ActiveRecord, Version=1.0.3.0, Culture=neutral,
> PublicKeyToken=407dd0808d44fbdc</ExceptionType><Message>Could not
> perform SlicedFindAll for Country</Message><StackTrace> at
> Castle.ActiveRecord.ActiveRecordBase.SlicedFindAll(Type targetType,
> Int32 firstResult, Int32 maxResults, Order[] orders, ICriterion[]
> criteria)
> at Castle.ActiveRecord.ActiveRecordBase.SlicedFindAll(Type
> targetType, Int32 firstResult, Int32 maxResults, ICriterion[]
> criteria)
> at Castle.ActiveRecord.ActiveRecordBase.FindOne(Type targetType,
> ICriterion[] criteria)
> at DataAccessLayer.Country.FindCountryByName(String name) in C:
> \Documents and Settings\ts36751\My Documents\Visual Studio
> 2008\Projects\HighlandAdventures\DataAccessLayer\Country.cs:line 108
> at ConsoleApp.Program.Main(String[] args) in C:\Documents and
> Settings\ts36751\My Documents\Visual Studio 2008\Projects
> \HighlandAdventures\ConsoleApp\Program.cs:line 20
> at System.AppDomain._nExecuteAssembly(Assembly assembly, String[]
> args)
> at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence
> assemblySecurity, String[] args)
> at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly
> ()
> at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
> at System.Threading.ExecutionContext.Run(ExecutionContext
> executionContext, ContextCallback callback, Object state)
> at System.Threading.ThreadHelper.ThreadStart()</
> StackTrace><ExceptionString>Castle.ActiveRecord.Framework.ActiveRecordException:
> Could not perform SlicedFindAll for Country ---&gt;
> NHibernate.WrongClassException: Object with id: 1 was not of the
> specified sublcass: DataAccessLayer.Photo (loading object was of wrong
> class [DataAccessLayer.Map])
> at NHibernate.Loader.Loader.InstanceAlreadyLoaded(IDataReader rs,
> Int32 i, ILoadable persister, EntityKey key, Object obj, LockMode
> lockMode, ISessionImplementor session)
> at NHibernate.Loader.Loader.GetRow(IDataReader rs, ILoadable[]
> persisters, EntityKey[] keys, Object optionalObject, EntityKey
> optionalObjectKey, LockMode[] lockModes, IList hydratedObjects,
> ISessionImplementor session)
> at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader
> resultSet, ISessionImplementor session, QueryParameters
> queryParameters, LockMode[] lockModeArray, EntityKey
> optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean
> returnProxies)
> at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session,
> QueryParameters queryParameters, Boolean returnProxies)
> at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections
> (ISessionImplementor session, QueryParameters queryParameters, Boolean
> returnProxies)
> at NHibernate.Loader.Loader.LoadCollection(ISessionImplementor
> session, Object id, IType type)
> at NHibernate.Loader.Collection.CollectionLoader.Initialize(Object
> id, ISessionImplementor session)
> at
> NHibernate.Persister.Collection.AbstractCollectionPersister.Initialize
> (Object key, ISessionImplementor session)
> at NHibernate.Impl.SessionImpl.InitializeCollection
> (IPersistentCollection collection, Boolean writing)
> at
> NHibernate.Collection.AbstractPersistentCollection.ForceInitialization
> ()
> at NHibernate.Impl.SessionImpl.InitializeNonLazyCollections()
> at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections
> (ISessionImplementor session, QueryParameters queryParameters, Boolean
> returnProxies)
> at NHibernate.Loader.Loader.DoList(ISessionImplementor session,
> QueryParameters queryParameters)
> at NHibernate.Loader.Loader.ListIgnoreQueryCache
> (ISessionImplementor session, QueryParameters queryParameters)
> at NHibernate.Loader.Loader.List(ISessionImplementor session,
> QueryParameters queryParameters, ISet querySpaces, IType[]
> resultTypes)
> at NHibernate.Loader.Criteria.CriteriaLoader.List
> (ISessionImplementor session)
> at NHibernate.Impl.SessionImpl.Find(CriteriaImpl criteria, IList
> results)
> at NHibernate.Impl.SessionImpl.Find(CriteriaImpl criteria)
> at NHibernate.Impl.CriteriaImpl.List()
> at Castle.ActiveRecord.ActiveRecordBase.SlicedFindAll(Type
> targetType, Int32 firstResult, Int32 maxResults, Order[] orders,
> ICriterion[] criteria)
> --- End of inner exception stack trace ---
> at Castle.ActiveRecord.ActiveRecordBase.SlicedFindAll(Type
> targetType, Int32 firstResult, Int32 maxResults, Order[] orders,
> ICriterion[] criteria)
> at Castle.ActiveRecord.ActiveRecordBase.SlicedFindAll(Type
> targetType, Int32 firstResult, Int32 maxResults, ICriterion[]
> criteria)
> at Castle.ActiveRecord.ActiveRecordBase.FindOne(Type targetType,
> ICriterion[] criteria)
> at DataAccessLayer.Country.FindCountryByName(String name) in C:
> \Documents and Settings\ts36751\My Documents\Visual Studio
> 2008\Projects\HighlandAdventures\DataAccessLayer\Country.cs:line 108
> at ConsoleApp.Program.Main(String[] args) in C:\Documents and
> Settings\ts36751\My Documents\Visual Studio 2008\Projects
> \HighlandAdventures\ConsoleApp\Program.cs:line 20
> at System.AppDomain._nExecuteAssembly(Assembly assembly, String[]
> args)
> at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence
> assemblySecurity, String[] args)
> at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly
> ()
> at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
> at System.Threading.ExecutionContext.Run(ExecutionContext
> executionContext, ContextCallback callback, Object state)
> at System.Threading.ThreadHelper.ThreadStart()</
> ExceptionString><InnerException><ExceptionType>NHibernate.WrongClassException,
> NHibernate, Version=1.2.0.4000, Culture=neutral,
> PublicKeyToken=aa95f207798dfdb4</ExceptionType><Message>Object with
> id: 1 was not of the specified sublcass: DataAccessLayer.Photo
> (loading object was of wrong class [DataAccessLayer.Map])</
> Message><StackTrace> at
> NHibernate.Loader.Loader.InstanceAlreadyLoaded(IDataReader rs, Int32
> i, ILoadable persister, EntityKey key, Object obj, LockMode lockMode,
> ISessionImplementor session)
> at NHibernate.Loader.Loader.GetRow(IDataReader rs, ILoadable[]
> persisters, EntityKey[] keys, Object optionalObject, EntityKey
> optionalObjectKey, LockMode[] lockModes, IList hydratedObjects,
> ISessionImplementor session)
> at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader
> resultSet, ISessionImplementor session, QueryParameters
> queryParameters, LockMode[] lockModeArray, EntityKey
> optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean
> returnProxies)
> at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session,
> QueryParameters queryParameters, Boolean returnProxies)
> at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections
> (ISessionImplementor session, QueryParameters queryParameters, Boolean
> returnProxies)
> at NHibernate.Loader.Loader.LoadCollection(ISessionImplementor
> session, Object id, IType type)
> at NHibernate.Loader.Collection.CollectionLoader.Initialize(Object
> id, ISessionImplementor session)
> at
> NHibernate.Persister.Collection.AbstractCollectionPersister.Initialize
> (Object key, ISessionImplementor session)
> at NHibernate.Impl.SessionImpl.InitializeCollection
> (IPersistentCollection collection, Boolean writing)
> at
> NHibernate.Collection.AbstractPersistentCollection.ForceInitialization
> ()
> at NHibernate.Impl.SessionImpl.InitializeNonLazyCollections()
> at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections
> (ISessionImplementor session, QueryParameters queryParameters, Boolean
> returnProxies)
> at NHibernate.Loader.Loader.DoList(ISessionImplementor session,
> QueryParameters queryParameters)
> at NHibernate.Loader.Loader.ListIgnoreQueryCache
> (ISessionImplementor session, QueryParameters queryParameters)
> at NHibernate.Loader.Loader.List(ISessionImplementor session,
> QueryParameters queryParameters, ISet querySpaces, IType[]
> resultTypes)
> at NHibernate.Loader.Criteria.CriteriaLoader.List
> (ISessionImplementor session)
> at NHibernate.Impl.SessionImpl.Find(CriteriaImpl criteria, IList
> results)
> at NHibernate.Impl.SessionImpl.Find(CriteriaImpl criteria)
> at NHibernate.Impl.CriteriaImpl.List()
> at Castle.ActiveRecord.ActiveRecordBase.SlicedFindAll(Type
> targetType, Int32 firstResult, Int32 maxResults, Order[] orders,
> ICriterion[] criteria)</
> StackTrace><ExceptionString>NHibernate.WrongClassException: Object
> with id: 1 was not of the specified sublcass: DataAccessLayer.Photo
> (loading object was of wrong class [DataAccessLayer.Map])
> at NHibernate.Loader.Loader.InstanceAlreadyLoaded(IDataReader rs,
> Int32 i, ILoadable persister, EntityKey key, Object obj, LockMode
> lockMode, ISessionImplementor session)
> at NHibernate.Loader.Loader.GetRow(IDataReader rs, ILoadable[]
> persisters, EntityKey[] keys, Object optionalObject, EntityKey
> optionalObjectKey, LockMode[] lockModes, IList hydratedObjects,
> ISessionImplementor session)
> at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader
> resultSet, ISessionImplementor session, QueryParameters
> queryParameters, LockMode[] lockModeArray, EntityKey
> optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean
> returnProxies)
> at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session,
> QueryParameters queryParameters, Boolean returnProxies)
> at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections
> (ISessionImplementor session, QueryParameters queryParameters, Boolean
> returnProxies)
> at NHibernate.Loader.Loader.LoadCollection(ISessionImplementor
> session, Object id, IType type)
> at NHibernate.Loader.Collection.CollectionLoader.Initialize(Object
> id, ISessionImplementor session)
> at
> NHibernate.Persister.Collection.AbstractCollectionPersister.Initialize
> (Object key, ISessionImplementor session)
> at NHibernate.Impl.SessionImpl.InitializeCollection
> (IPersistentCollection collection, Boolean writing)
> at
> NHibernate.Collection.AbstractPersistentCollection.ForceInitialization
> ()
> at NHibernate.Impl.SessionImpl.InitializeNonLazyCollections()
> at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections
> (ISessionImplementor session, QueryParameters queryParameters, Boolean
> returnProxies)
> at NHibernate.Loader.Loader.DoList(ISessionImplementor session,
> QueryParameters queryParameters)
> at NHibernate.Loader.Loader.ListIgnoreQueryCache
> (ISessionImplementor session, QueryParameters queryParameters)
> at NHibernate.Loader.Loader.List(ISessionImplementor session,
> QueryParameters queryParameters, ISet querySpaces, IType[]
> resultTypes)
> at NHibernate.Loader.Criteria.CriteriaLoader.List
> (ISessionImplementor session)
> at NHibernate.Impl.SessionImpl.Find(CriteriaImpl criteria, IList
> results)
> at NHibernate.Impl.SessionImpl.Find(CriteriaImpl criteria)
> at NHibernate.Impl.CriteriaImpl.List()
> at Castle.ActiveRecord.ActiveRecordBase.SlicedFindAll(Type
> targetType, Int32 firstResult, Int32 maxResults, Order[] orders,
> ICriterion[] criteria)</ExceptionString></InnerException></Exception></
> TraceRecord>
>
>
> Thanks,
> Thi
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Castle Project Users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/castle-project-users?hl=en
-~----------~----~----~----~------~----~------~--~---