I've found why the error was occurring... doesn't seem to support
nested classes even though NH does... This was mainly due the 'name'
attribute of the 'class' element in the hbm mapping file being set to
the class name. which isn't the complete class name for nested types.
I fixed it by just setting it to the class's FullName - the class'
namespace. For nested classes the class name should be of the form
OuterClass+NestedClass where NestedClass is nested within OuterClass
rather than just NestedClass. I've also added a test verifying that
nested classes are now being mapped properly. As seen in this thread
howerver, 
http://groups.google.com/group/fluent-nhibernate/browse_thread/thread/15fdb057ec89078e,
solving one problem simply lead to another. :(


On Feb 19, 10:35 am, Jimit <[email protected]> wrote:
> Additionally I'm now getting the following error:
>
> PersistenceTests.Can_Map_Orders_To_Database : Failed
> System.Xml.Schema.XmlSchemaValidationException:
>
> The element 'class' in namespace 'urn:nhibernate-mapping-2.2' has
> invalid child element 'set' in
>
> namespace 'urn:nhibernate-mapping-2.2'. List of possible elements
> expected: 'id, composite-id' in
>
> namespace 'urn:nhibernate-mapping-2.2'.
> -- Exception doesn't have a stack trace --
> NHibernate.MappingException: (XmlDocument)(5,6): XML validation error:
> The element 'class' in
>
> namespace 'urn:nhibernate-mapping-2.2' has invalid child element 'set'
> in namespace
>
> 'urn:nhibernate-mapping-2.2'. List of possible elements expected: 'id,
> composite-id' in namespace
>
> 'urn:nhibernate-mapping-2.2'.
> at NHibernate.Cfg.Configuration.LogAndThrow(Exception exception)
> at NHibernate.Cfg.Configuration.ValidationHandler(Object o,
> ValidationEventArgs args)
> at System.Xml.Schema.XmlSchemaValidator.SendValidationEvent
> (ValidationEventHandler eventHandler,
>
> Object sender, XmlSchemaValidationException e, XmlSeverityType
> severity)
> at System.Xml.Schema.XmlSchemaValidator.ElementValidationError
> (XmlQualifiedName name, ValidationState
>
> context, ValidationEventHandler eventHandler, Object sender, String
> sourceUri, Int32 lineNo, Int32
>
> linePos, Boolean getParticles)
> at System.Xml.Schema.XmlSchemaValidator.ValidateElementContext
> (XmlQualifiedName elementName, ref
>
> Boolean invalidElementInContext)
> at System.Xml.Schema.XmlSchemaValidator.ValidateElement(String
> localName, String namespaceUri,
>
> XmlSchemaInfo schemaInfo, String xsiType, String xsiNil, String
> xsiSchemaLocation, String
>
> xsiNoNamespaceSchemaLocation)
> at System.Xml.XsdValidatingReader.ProcessElementEvent()
> at System.Xml.XsdValidatingReader.ProcessReaderEvent()
> at System.Xml.XsdValidatingReader.Read()
> at System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace)
> at System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)
> at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader,
> Boolean preserveWhitespace)
> at System.Xml.XmlDocument.Load(XmlReader reader)
> at NHibernate.Cfg.Configuration.LoadMappingDocument(XmlReader
> hbmReader, String name)
> at NHibernate.Cfg.Configuration.AddXmlReader(XmlReader hbmReader,
> String name)
> at NHibernate.Cfg.Configuration.AddInputStream(Stream xmlInputStream,
> String name)
> at NHibernate.Cfg.Configuration.AddDocument(XmlDocument doc, String
> name)
> at NHibernate.Cfg.Configuration.AddDocument(XmlDocument doc)
> at FluentNHibernate.MappingVisitor.AddMappingDocument(XmlDocument
> document, Type type) in c:\Code
>
> Samples\NHibernate\Fluent Nhibernate\src\FluentNHibernate
> \MappingVisitor.cs: line 34
> at FluentNHibernate.Mapping.ClassMap`1.ApplyMappings(IMappingVisitor
> visitor) in c:\Code
>
> Samples\NHibernate\Fluent Nhibernate\src\FluentNHibernate\Mapping
> \ClassMap.cs: line 184
> System.ApplicationException: Error while trying to build the Mapping
> Document for
>
> 'Core.Domain.Entities.Order+Item'
> at FluentNHibernate.Mapping.ClassMap`1.ApplyMappings(IMappingVisitor
> visitor) in c:\Code
>
> Samples\NHibernate\Fluent Nhibernate\src\FluentNHibernate\Mapping
> \ClassMap.cs: line 200
> at FluentNHibernate.PersistenceModel.<>c__DisplayClass1.<Configure>b__0
> (IMapping mapping) in c:\Code
>
> Samples\NHibernate\Fluent Nhibernate\src\FluentNHibernate
> \PersistenceModel.cs: line 91
> at System.Collections.Generic.List`1.ForEach(Action`1 action)
> at FluentNHibernate.PersistenceModel.Configure(Configuration
> configuration) in c:\Code
>
> Samples\NHibernate\Fluent Nhibernate\src\FluentNHibernate
> \PersistenceModel.cs: line 91
> at FluentNHibernate.AutoMap.AutoPersistenceModel.Configure
> (Configuration configuration) in c:\Code
>
> Samples\NHibernate\Fluent Nhibernate\src\FluentNHibernate\AutoMap
> \AutoPersistenceModel.cs: line 115
> at FluentNHibernate.Cfg.AutoMappingsContainer.Apply(Configuration cfg)
> in c:\Code
>
> Samples\NHibernate\Fluent Nhibernate\src\FluentNHibernate\Cfg
> \AutoMappingsContainer.cs: line 70
> at FluentNHibernate.Cfg.MappingConfiguration.Apply(Configuration cfg)
> in c:\Code
>
> Samples\NHibernate\Fluent Nhibernate\src\FluentNHibernate\Cfg
> \MappingConfiguration.cs: line 51
> at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() in
> FluentConfiguration.cs: line 93
> FluentNHibernate.Cfg.FluentConfigurationException: An invalid or
> incomplete configuration was used
>
> while creating a SessionFactory. Check PotentialReasons collection,
> and InnerException for more
>
> detail.
>
> at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() in
> FluentConfiguration.cs: line 102
> at Core.Infrastructure.Data.NHibernate.Tests.PersistenceTests.SetUp()
> in PersistenceTests.cs: line 22
>
> This is the mapping file produced from the APM:
>
> <?xml version="1.0" encoding="utf-8"?>
> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-
> lazy="true" assembly="Core.Domain" namespace="Core.Domain.Entities"
> schema="Orders">
>   <class name="Item" table="OrderItem" xmlns="urn:nhibernate-
> mapping-2.2">
>     <cache usage="read-write" />
>     <set name="Parts" cascade="save-update">
>       <key column="ItemID" />
>       <one-to-many class="Core.Domain.Entities.Order+Item+Part,
> Core.Domain, Version=0.1.3336.32427, Culture=neutral,
> PublicKeyToken=94dc7dc697cfcfc0" />
>     </set>
>     <many-to-one property-ref="Items" name="Order" column="OrderId" />
>   </class>
> </hibernate-mapping>
>
> For some reason it only contains the parts I'd overridden in my
> mapping override for Order.Item. I'm guessing the AutoMapper's
> mapEverythingInClass either was not called or it was not merged with
> the overrides in the IMappingOverride. Also, the class name is just
> "Item". Could it be that the validation was trying to find a class
> named Item and couldn't find it and hence it wasn't mapped/merged?
>
> Here's the override:
>     [CLSCompliant(false)]
>     public class OrderItemAutoMappingOverride :
> IAutoMappingOverride<Order.Item>
>     {
>
>         #region IAutoMappingOverride<Item> Members
>
>         public void Override
> (FluentNHibernate.AutoMap.AutoMap<Order.Item> mapping)
>         {
>             mapping.HasMany(item => item.Parts)
>                 .AsSet()
>                 .Cascade.All();
>             mapping.References(i => i.Order)
>                 .PropertyRef(o => o.Items);
>             mapping.SchemaIs("Orders");
>             //mapping.WithTable("OrderItem");
>         }
>
>         #endregion
>     }
>
> I've seen similar results with all my nested classes. The AutoMapper
> is either not discovering their properties or the discovered
> properties are not getting merged with my mapping overrides.
>
> On Feb 18, 11:05 am, Jimit <[email protected]> wrote:
>
> > Glad to help.
> > It seems not to have solved my problem though. Amappingfile for
> > DomainObject is still being generated. I think because
> > ForTypesThatDeriveFrom<DomainObject> (or IMappingOverride.Override)
> > creates an AutoMap<DomainObject> for DomainObject (which is meant to
> > be used just for merging with AutoMaps of derived types since
> > DomainObject is a base class) it still bypasses the logic that would
> > exclude it. This means that base classes make it into the 
> > finalmappingregardless of their exclusion by Conventions.IsBaseClass. I
> > think we might need to do a final filter after all the merges have
> > been done to exclude base class AutoMaps that were created by
> > ForTypesThatDeriveFrom or via an IMappingOverride. Alternatively we
> > could add a parameter to AutoMapper.MergeMap called isBaseClass (bool)
> > which we could use to determine if mapEverythingInClass() should be
> > called (i.e do we just want to merge with mappings for derived types
> > or do we want to map the class itself as well).
>
> > On Feb 17, 10:59 pm, James Gregory <[email protected]> wrote:
>
> > > Thanks for the patch, I will review it tomorrow.
>
> > > On Tue, Feb 17, 2009 at 6:58 PM, Jimit <[email protected]> wrote:
>
> > > > I've created a patch adding support formappingentities in multiple
> > > > assemblies. It basically follows the logic I suggested in the posts
> > > > above. I've added a test verifying it works and as well as updated 3
> > > > tests that were failing as a result (I think) of a recent change in
> > > > the mappings pushing column declarations in the xml from attributes to
> > > > elements. I just updated the XPATH query to point to the "column"
> > > > element and set the HasAttribute to look for the "name" attribute for
> > > > all three tests. They are (in the AutoPersistenceModelTests class):
> > > > MapsPropertyWithPropertyConvention,
> > > > ComponentColumnConventionReceivesProperty and
> > > > ComponentPropertiesAssumeComponentColumnPrefix. You might want to
> > > > confirm that that is the expected behaviour.
>
> > > > In order to create the test formappingentities from multiple
> > > > assemblies I added a reference to Examples.FirstProject to the test
> > > > project.
>
> > > > Here's the patch. I apologize in advance if this isn't the accepted
> > > > way to submit patches. Just let me know how it's normally done and
> > > > I'll do so henceforth.:
>
> > > > Index: src/FluentNHibernate.Testing/AutoMap/
> > > > AutoPersistenceModelTests.cs
> > > > ===================================================================
> > > > --- src/FluentNHibernate.Testing/AutoMap/AutoPersistenceModelTests.cs
> > > > (revision 0)
> > > > +++ src/FluentNHibernate.Testing/AutoMap/AutoPersistenceModelTests.cs
> > > > (revision 0)
> > > > @@ -0,0 +1,477 @@
> > > > +using System;
> > > > +using System.Diagnostics;
> > > > +using FluentNHibernate.AutoMap;
> > > > +using FluentNHibernate.AutoMap.TestFixtures.ComponentTypes;
> > > > +using FluentNHibernate.AutoMap.TestFixtures.CustomTypes;
> > > > +using NUnit.Framework;
> > > > +using SuperTypes = FluentNHibernate.AutoMap.TestFixtures.SuperTypes;
> > > > +using FluentNHibernate.AutoMap.TestFixtures;
> > > > +
> > > > +namespace FluentNHibernate.Testing.AutoMap
> > > > +{
> > > > +  
>
> ...
>
> read more »
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Fluent NHibernate" 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/fluent-nhibernate?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to