Ok, I realized why it was not letting me put the properties under the
main class.  I didn't know that the order mattered and the
discriminator element needed to be before the properties.  So that is
fixed now.  I still get the same error though:

> "The element 'class' in namespace 'urn:nhibernate-mapping-2.2' has
> invalid child element 'discriminator' in namespace 'urn:nhibernate-
> mapping-2.2'. List of possible elements expected: 'property, many-to-
> one, one-to-one, component, dynamic-component, properties, any, map,
> set, list, bag, idbag, array, primitive-array, join, subclass, joined-
> subclass, union-subclass, loader, sql-insert, sql-update, sql-delete,
> filter, resultset, query, sql-query' in namespace 'urn:nhibernate-
> mapping-2.2'."

This is my current mapping file:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="MyApp.DomainEntities, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=01ca2278eac9ed50" namespace="MyApp.DomainEntities"
default-lazy="false">

  <class name="IItinerary" table="Itinerary" abstract="true"
discriminator-value="A">
                <id name="Id" column="Id" type="Int32">
                        <generator class="native" />
                </id>
    <discriminator column="Movement" type="Char" />
    <many-to-one name="Personnel" column="PersonnelId"
class="Personnel"/>
    <many-to-one name="ClassEnrollment" column="EnrollmentId"
class="ClassEnrollment"/>
    <many-to-one name="Airline" column="AirlineId" class="Airline"/>
    <property name="Movement" type="Char" access="readonly"/>
    <property name="FlightNumber" type="String" />
    <property name="DepartureLocation" type="String" />
    <property name="DepartureTime" type="DateTime" />
    <property name="ArrivalLocation" type="String" />
    <property name="ArrivalTime" type="DateTime" />
    <property name="Instructions" column="SpecialInstructions"
type="String" />
    <property name="ModifiedDate" type="DateTime" />

    <subclass name="InboundItinerary" discriminator-value="I"
lazy="false">
    </subclass>
    <subclass name="OutboundItinerary" discriminator-value="O"
lazy="false">
    </subclass>

        </class>
</hibernate-mapping>


On Apr 23, 5:02 pm, Arthur Dent <[email protected]> wrote:
> Thanks for the response Marcelo!  Ok, I have tried making the changes
> you suggested.  I suppose you could say that putting the properties
> into the subclasses was by design, but I couldn't find any good
> information on how to implement this scenario in the NH
> documentation.  My parent class is just an interface.  I wasn't sure
> if I should use the "abstract=true" property for its tag either.  It's
> not a true abstract class, but it's not a concrete class either.
>
> When I try to put the common properties in the parent class
> (IItinerary) in the mapping, I get the following error:
>
> "The element 'class' in namespace 'urn:nhibernate-mapping-2.2' has
> invalid child element 'discriminator' in namespace 'urn:nhibernate-
> mapping-2.2'. List of possible elements expected: 'property, many-to-
> one, one-to-one, component, dynamic-component, properties, any, map,
> set, list, bag, idbag, array, primitive-array, join, subclass, joined-
> subclass, union-subclass, loader, sql-insert, sql-update, sql-delete,
> filter, resultset, query, sql-query' in namespace 'urn:nhibernate-
> mapping-2.2'."
>
> Leaving the properties in the subclasses, and making the Movement
> field non-nullable doesn't fix the issue.  I still get the same error:
>
> "Object with id: 4 was not of the specified subclass:
> MyApp.DomainEntities.InboundItinerary (loading object was of wrong
> class [MyApp.DomainEntities.OutboundItinerary])"
>
> Is there anything else that looks wrong in my configuration?
>
> On Apr 20, 3:22 pm, Marcelo Grossi <[email protected]> wrote:
>
>
>
>
>
>
>
> > Movement field should not be nullable. And also you have repeated
> > properties in your subclasses, is this by design? You should place the
> > common properties in the parent class.. it shouldn't matter if your
> > subclasses have no properties.
>
> > --
> > Marcelo Grossi
>
> > On Apr 20, 4:23 am, Arthur Dent <[email protected]> wrote:
>
> > > I'm trying to implement the table per class hierarchy model for
> > > itineraries in my app.  I have a single Itinerary table, and the
> > > Movement field will have either an "I" or "O" as the discriminator for
> > > "inbound" or "outbound" itineraries.
>
> > > I have set up an "IItinerary" interface to use as my parent class.
> > > Both InboundItinerary and OutboundItinerary classes implement this.
> > > They also inherit from a base Itinerary class, that in turn inherits
> > > from a BaseObject class that I use for most of the objects in my app.
>
> > > The problem I'm having is that it doesn't seem to be able to determine
> > > what type of itinerary each record is when they get loaded.  I get
> > > this error:
> > > "Object with id: 1 was not of the specified subclass:
> > > MyApp.DomainEntities.InboundItinerary (loading object was of wrong
> > > class [MyApp.DomainEntities.OutboundItinerary])"
>
> > > Am I doing something wrong in my implementation?  I found some similar
> > > issues while searching for an answer, and I turned off lazy loading
> > > because that seemed to fix it for some people.  Is there something
> > > else I'm missing?
>
> > > Itinerary Table
> > > ------------------------------------------------------
> > > CREATE TABLE [dbo].[Itinerary](
> > >         [Id] [int] IDENTITY(1,1) NOT NULL,
> > >         [EnrollmentId] [int] NOT NULL,
> > >         [PersonnelId] [int] NULL,
> > >         [AirlineId] [smallint] NOT NULL,
> > >         [Movement] [char](1) NULL,
> > >         [FlightNumber] [varchar](25) NOT NULL,
> > >         [DepartureLocation] [varchar](25) NOT NULL,
> > >         [DepartureTime] [smalldatetime] NOT NULL,
> > >         [ArrivalLocation] [varchar](25) NOT NULL,
> > >         [ArrivalTime] [smalldatetime] NOT NULL,
> > >         [SpecialInstructions] [varchar](max) NULL CONSTRAINT
> > > [DF_Itinerary_Instructions]  DEFAULT (space((0))),
> > >         [ModifiedDate] [smalldatetime] NULL CONSTRAINT [DF_Itinerary_Date]
> > > DEFAULT (getdate()),
> > >  CONSTRAINT [PK_Itinerary] PRIMARY KEY CLUSTERED
> > > (
> > >         [Id] ASC
> > > )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY
> > > = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
> > > ) ON [PRIMARY]
> > > ------------------------------------------------------
>
> > > Itinerary Mapping
> > > ------------------------------------------------------
> > > <?xml version="1.0" encoding="utf-8" ?>
> > > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
> > > assembly="MyApp.DomainEntities, Version=1.0.0.0, Culture=neutral,
> > > PublicKeyToken=01ca2278eac9ed50" namespace="MyApp.DomainEntities"
> > > default-lazy="false">
>
> > >   <class name="IItinerary" table="Itinerary" abstract="true"
> > > discriminator-value="A">
> > >                 <id name="Id" column="Id" type="Int32">
> > >                         <generator class="native" />
> > >                 </id>
>
> > >     <discriminator column="Movement" type="Char" />
> > >     <subclass name="InboundItinerary" discriminator-value="I"
> > > lazy="false">
> > >       <many-to-one name="Personnel" column="PersonnelId"
> > > class="Personnel"/>
> > >       <many-to-one name="ClassEnrollment" column="EnrollmentId"
> > > class="ClassEnrollment"/>
> > >       <many-to-one name="Airline" column="AirlineId" class="Airline"/>
>
> > >       <property name="FlightNumber" type="String" />
> > >       <property name="DepartureLocation" type="String" />
> > >       <property name="DepartureTime" type="DateTime" />
> > >       <property name="ArrivalLocation" type="String" />
> > >       <property name="ArrivalTime" type="DateTime" />
> > >       <property name="Instructions" column="SpecialInstructions"
> > > type="String" />
> > >       <property name="ModifiedDate" type="DateTime" />
> > >     </subclass>
> > >     <subclass name="OutboundItinerary" discriminator-value="O"
> > > lazy="false">
> > >       <many-to-one name="Personnel" column="PersonnelId"
> > > class="Personnel"/>
> > >       <many-to-one name="ClassEnrollment" column="EnrollmentId"
> > > class="ClassEnrollment"/>
> > >       <many-to-one name="Airline" column="AirlineId" class="Airline"/>
>
> > >       <property name="FlightNumber" type="String" />
> > >       <property name="DepartureLocation" type="String" />
> > >       <property name="DepartureTime" type="DateTime" />
> > >       <property name="ArrivalLocation" type="String" />
> > >       <property name="ArrivalTime" type="DateTime" />
> > >       <property name="Instructions" column="SpecialInstructions"
> > > type="String" />
> > >       <property name="ModifiedDate" type="DateTime" />
> > >     </subclass>
>
> > >         </class>
> > > </hibernate-mapping>
> > > ------------------------------------------------------
>
> > > IItinerary Interface
> > > ------------------------------------------------------
> > > Public Interface IItinerary
> > >     Property Airline() As Airline
> > >     Property ArrivalLocation() As String
> > >     Property ArrivalTime() As Nullable(Of DateTime)
> > >     Property ClassEnrollment() As ClassEnrollment
> > >     Property Personnel As Personnel
> > >     ReadOnly Property Movement As Char
> > >     Property ModifiedDate() As Nullable(Of DateTime)
> > >     Property DepartureLocation() As String
> > >     Property DepartureTime() As Nullable(Of DateTime)
> > >     Property FlightNumber() As String
> > >     Property Id() As Integer
> > >     Property Instructions() As String
> > > End Interface
> > > ------------------------------------------------------
>
> > > Itinerary Base Class
> > > ------------------------------------------------------
> > > <Serializable()> _
> > > Public MustInherit Class Itinerary
> > >     Inherits BaseObject
> > >     Implements IComparable
>
> > >     Public MustOverride Function CompareTo(ByVal obj As Object) As
> > > Integer Implements System.IComparable.CompareTo
>
> > > End Class
> > > ------------------------------------------------------
>
> > > InboundItinerary Class (Outbound is essentially identical aside from
> > > the name)
> > > ------------------------------------------------------
> > > <Serializable()> _
> > > Public Class InboundItinerary
> > >     Inherits Itinerary
> > >     Implements IComparable
> > >     Implements IItinerary
>
> > >     Private _airline As Airline
> > >     Private _arrivalLocation As String
> > >     Private _arrivalTime As Nullable(Of DateTime)
> > >     Private _departureLocation As String
> > >     Private _departureTime As Nullable(Of DateTime)
> > >     Private _enrollment As ClassEnrollment
> > >     Private _flightNumber As String
> > >     Private _id As Integer
> > >     Private _instructions As String
> > >     Private _movement As Char
> > >     Private _modifiedDate As Nullable(Of DateTime)
> > >     Private _personnel As Personnel
>
> > >     Public Overridable Property Airline() As Airline Implements
> > > IItinerary.Airline
> > >         Get
> > >             Return _airline
> > >         End Get
> > >         Set(ByVal value As Airline)
> > >             _airline = value
> > >         End Set
> > >     End Property
>
> > >     Public Overridable Property ArrivalLocation() As String Implements
> > > IItinerary.ArrivalLocation
> > >         Get
> > >             Return _arrivalLocation
> > >         End Get
> > >         Set(ByVal value As String)
> > >             _arrivalLocation = value
> > >         End Set
> > >     End Property
>
> > >     Public Overridable Property ArrivalTime() As Nullable(Of DateTime)
> > > Implements IItinerary.ArrivalTime
> > >         Get
> > >             Return _arrivalTime
> > >         End Get
> > >         Set(ByVal value As Nullable(Of DateTime))
> > >             _arrivalTime = value
> > >         End Set
> > >     End Property
>
> > >     Public Overridable Property ClassEnrollment() As ClassEnrollment
>
> ...
>
> read more »

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" 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/nhusers?hl=en.

Reply via email to