various causes: 1) your id (native) is unique in a class hierarchy (you have Employee#1 and Student#1) 2) you are using the same column (EntityID) for both reference in a table-per-class-hierarchy 3) you are lucky; have a look to FKs created for EntityID column
Solution: use two different column-name for the relation On Mon, Aug 16, 2010 at 9:23 AM, MSD <[email protected]> wrote: > I have the following classes: > public enum ContactValueType : short {...} > public abstract class ContactDetail > { > public int ID { get; protected set; } > public virtual ContactValueType ValueType { get; protected set; } > public virtual string Value { get; protected set; } > > public ContactDetail(){} > public ContactDetail(ContactValueType valueType, string value) > { > this.ValueType = valueType; > this.Value = value; > } > } > public class StudentContactDetail : ContactDetail > { > public virtual Student Student { get; set; } > public StudentContactDetail(){} > public StudentContactDetail(Student student, ContactValueType > valueType, string value) : base(valueType, value) > { > this.Student = student; > } > } > public class EmployeeContactDetail : ContactDetail > { > public virtual Employee Employee { get; set; } > public EmployeeContactDetail(){} > public EmployeeContactDetail(Employee employee, ContactValueType > valueType, string value) : base(valueType, value) > { > this.Employee = employee; > } > } > > public class Employee > { > public int ID { get; protected set; } > public virtual string Name { get; set; } > public virtual > Iesi.Collections.Generic.ISet<EmployeeContactDetail> ContactDetails > { get; protected set; } > > protected Employee() > { > ContactDetails = new > Iesi.Collections.Generic.HashedSet<EmployeeContactDetail>(); > } > public Employee(string name) : this() > { > this.Name = name; > } > } > > public class Student > { > public int ID { get; protected set; } > public virtual string Name { get; set; } > public virtual Iesi.Collections.Generic.ISet<StudentContactDetail> > ContactDetails { get; protected set; } > > protected Student() > { > ContactDetails = new > Iesi.Collections.Generic.HashedSet<StudentContactDetail>(); > } > public Student(string name): this() > { > this.Name = name; > } > } > > their tables: > > ContactDetail > ID int > EntityType char(1) > EntityID int > ValueType smallint > Value nvarchar(50) > Employee > ID int > Name nvarchar > Student > ID int > Name nvarchar > > > and their mappings: > > <class name="ContactDetail" table="ContactDetail" lazy="false"> > <id name="ID" column="ID"> > <generator class="native"/> > </id> > <discriminator column="EntityType" type="String" /> > <property name="ValueType" column="ValueType"/> > <property name="Value" column="Value"/> > <subclass name="StudentContactDetail" discriminator-value="S"> > <many-to-one name="Student"> > <column name="EntityID" /> > </many-to-one> > </subclass> > <subclass name="EmployeeContactDetail" discriminator-value="E"> > <many-to-one name="Employee"> > <column name="EntityID" /> > </many-to-one> > </subclass> > </class> > > <class name="Student" table="Student" lazy="false"> > <id name="ID"> > <generator class="native"/> > </id> > <property name="Name"> > <column name="Name" length="50" not-null="true" /> > </property> > <set name="ContactDetails" fetch="select" lazy="false" > cascade="all"> > <key column="EntityID" /> > <one-to-many class="StudentContactDetail" /> > </set> > </class> > > <class name="Employee" table="Employee" lazy="false"> > <id name="ID"> > <generator class="native"/> > </id> > <property name="Name"> > <column name="Name" length="50" not-null="true" /> > </property> > <set name="ContactDetails" fetch="select" lazy="false" > cascade="all"> > <key column="EntityID" /> > <one-to-many class="EmployeeContactDetail" /> > </set> > </class> > > When persisting Student and Employee instances all is fine, but when > loading them, their ContactDetails collection is populated by ALL > ContactDetails, that is disregarding the discriminator in the select > statement. > Why is that and what can I do aside from this: > > <set name="ContactDetails" fetch="select" lazy="false" cascade="all" > where="EntityType='E'"> > > (adding the where attribute). > Thanks > > -- > 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]<nhusers%[email protected]> > . > For more options, visit this group at > http://groups.google.com/group/nhusers?hl=en. > > -- Fabio Maulo -- 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.
