I re-checked what you had posted, and I agree you kind of mentioned inheritance in your post, but you did not show the design for the tables which is the real CATCH here since I am using a single column as a shared FK. Please correct me if the coffee has not kicked in yet :)
On Mon, Aug 16, 2010 at 10:23 PM, Muhammad Shehabeddeen < [email protected]> wrote: > Jide, > This implementation is different from the one in the other topic (it uses > inheritance and a discriminator) and that is why I decided to post it in a > separate question. This is one implementation suggested by a friend, and I > was not asking how to implement the concept, I was just asking why the > implementation was flawed. In anyway, I can link to it if necessary. > > > > > On Mon, Aug 16, 2010 at 10:00 PM, JideO <[email protected]> wrote: > >> MSD, >> >> You decided to repost the solution I suggested to you on the earlier >> topic: >> http://groups.google.com/group/nhusers/browse_thread/thread/1d2319f44... >> as a different topic instead of continuing with the previous >> discussion. You will make it difficult other people including myself >> who were following the previous discussion to benefit from the >> contribution from the community on the topic. >> >> >> Apparently you have not properly implemented the mappings. >> >> >> Jide >> >> >> >> >> On Aug 16, 1:33 pm, Fabio Maulo <[email protected]> wrote: >> > 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]> >> <nhusers%[email protected]<nhusers%[email protected]> >> > >> > > . >> > > For more options, visit this group at >> > >http://groups.google.com/group/nhusers?hl=en. >> > >> > -- >> > Fabio Maulo- Hide quoted text - >> > >> > - Show quoted text - >> >> -- >> 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. >> >> > -- 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.
