1
votes

This question is really to establish if what im trying to achieve is possible.

I have three tables i'll omit the actual names to keep it simple and less confusing

so we have

Person [ PID - uniqueidentifier PK ]

Applicant [ PID - uniqueidentifier PK, AID - varchar(20)]

Student [ PID - uniqueidentifier PK, SID - int]

both the student and applicant tables are related to the person table with a one-to-one relationship (where the primary key is held in the person table), but are not related to each other.

I have the following domain objects

public class Person
{
    public virtual Guid PID{get;set;}
}

public class Applicant: Person
{
    public virtual string AID {get;set;}
}

public class Student:Person
{
    public virtual int SID {get;set;}
}

These each have a map class derived from either ClassMap or SubClassMap

public class PersonMap: ClassMap<Person>
{
    public PersonMap()
    {
        Id(x => x.PID).GeneratedBy.Assigned();
        Table("Person");
    }
}

public class ApplicantMap: SubclassMap<Applicant>
{
    public ApplicantMap()
    {
        Table("Applicant");
        KeyColumn("PID");
        Map(x => x.AID);
    }
}

public class StudentMap:SubclassMap<Student>
{
    public StudentMap()
    {
        Table("Student");
        KeyColumn("PID");
        Map(x => x.SID);
    }
}

My question is, is it possible to have a person who is an applicant and a student at the same time.In database terms I can have a row in each table that holds the same PID, will nhibernate allow me to save and retrieve all three objects?

one of the problems I have is trying to insert into student when the id already exists for an applicant and of course person..

public void MakePersonAStudent(Person p)
{
    Student newStudent = new Student();
    newStudent.PID = p.PID;
    newStudent.SID = getNewStudentID();
    Session.Save(newPerson);
}    

The exception generated is:

a different object with the same identifier value was already associated with the session .... 73e5fd90-c27a-49d8-87dc-cd6413c120a2, of entity: Student

1

1 Answers