That's the title of the thread, Gustavo :-) Diego
On Sat, Mar 13, 2010 at 03:33, Gustavo Ringel <[email protected]>wrote: > did you try idbag instead of bag, in general it is more suited for many to > many relations, it lets you define de id of the connecting table. > > In general i do not create both one to many relations for the connection if > there is no specific value. If you need to have info in the middle, like > date of subscription to the specific school, then you can use bags for sure. > > Gustavo. > > On Sat, Mar 13, 2010 at 8:07 AM, tqwhite <[email protected]> wrote: > >> I'm getting so beaten up and confused by this. I have never had this >> much trouble getting something to work. >> >> I actually considered the not-null issue before. At one point, I >> asserted not-null="false" in all the places but it made no difference. >> I just did it again and found that it generates the same schema either >> way. Probably a bug, but it's true that I also didn't check. Arrgggh. >> >> So, I read the bidirectional association. As best I can tell, the only >> difference is that I didn't add the attribute, inverse="true" to the >> many side, aka, bag. I tried this at one point before as a pure random >> experiment. As with tonight, it didn't solve the problem. >> >> Still, I did it again: >> >> <bag name="students" inverse="true"> >> <bag name="schools" inverse="true"> >> >> And I still get the null violation. >> >> So, I know these things: >> >> 1) My mapping basically works. When I manually remove "not null" and >> the foreign key constraints from my database, I get the database >> results I want. >> >> 2) Inverse="true" added to the bag, doesn't do it. >> >> 3) NH can do this, so I must have something wrong that I am can't >> find. >> >> Here is what the manual says, interleaved with notes: >> >> <class name="Eg.Parent, Eg"> <!-- For me, Parent is the student and >> school entities, one student/school has many enrollments--> >> <id name="Id" column="id"/> >> .... >> <set name="Children" inverse="true" lazy="true"> <!-- I use a bag >> since I don't want them ordered and I couldn't get the type right when >> I tried using a set for fun. The docs, and common sense, say this is >> ok. Right?--> >> <key column="parent_id"/> <!-- I use SchoolInfoRefId (or >> StudentInfoRefId both here and in the many-to-one--> >> <one-to-many class="Eg.Child, Eg"/> >> </set> >> </class> >> >> <class name="Eg.Child, Eg"> <!-- for me, this is the StudentSchool >> join table. Many enrollments can relate to a single student/school. -- >> > >> <id name="Id" column="id"/> >> .... >> <many-to-one name="Parent" class="Eg.Parent, Eg" >> column="parent_id"/> >> </class> >> >> I just cannot see anything wrong with my code. I've been at this for >> the last four hours. I'm dying. >> >> tqii >> >> >> On Mar 12, 3:36 pm, Diego Mijelshon <[email protected]> wrote: >> > http://nhforge.org/doc/nh/en/index.html#collections-onetomany >> > <http://nhforge.org/doc/nh/en/index.html#collections-onetomany> >> > >> > *Very Important Note:* If the <key> column of a <one-to-many> >> association is >> > declared NOT NULL, NHibernate may cause constraint violations when it >> > creates or updates the association. To prevent this problem, *you must >> use a >> > bidirectional association* with the many valued end (the set or bag) >> marked >> > as inverse="true". See the discussion of bidirectional associations >> later in >> > this chapter. >> http://nhforge.org/doc/nh/en/index.html#collections-bidirectional >> > >> > Diego >> > >> > >> > >> > On Fri, Mar 12, 2010 at 16:58, tqwhite <[email protected]> wrote: >> > > Thanks. I have been wondering if that might not be the best way. I >> > > htink I read something different someplace to get me on the wrong way. >> > >> > > I have implemented the "dual one-to-many" strategy. But, I get an >> > > error message saying that I, "Cannot insert the value NULL into >> > > column". That column is the foreign key in the join table. Basically, >> > > NH is not getting the id from the objects I am trying to connect to >> > > the join table. >> > >> > > I am loathe to ask anyone to read much code, but I am clearly not >> > > getting some important thing, so please be patient. >> > >> > > Here is what I have done: >> > >> > > <class ... student >> > > <!-- all kinds of stuff that works except for this problem, id is >> > > RefId, a uuid.hex --> >> > >> > > <bag name="schools"> >> > > <key column="SchoolInfoRefId"/> >> > > <one-to-many class="AssemblyName.Models.StudentSchoolEnrollment, >> > > AssemblyName" /> >> > > </bag> >> > >> > > </class> >> > >> > > <class ... school >> > > <!-- all kinds of stuff that works except for this problem, id is >> > > RefId, a uuid.hex --> >> > >> > > <bag name="students"> >> > > <key column="StudentPersonalRefId"/> >> > > <one-to-many class="AssemblyName.Models.StudentSchoolEnrollment, >> > > AssemblyName" /> >> > > </bag> >> > > </bag> >> > >> > > </class> >> > >> > > <class ... StudentSchools ... >> > > <!-- id and one property that is not controversial, but I haven't >> > > built a separate test, id is RefId, a uuid.hex --> >> > >> > > <many-to-one class="AssemblyName.Models.Student, AssemblyName" >> > > name="school" column="StudentPersonalRefId"/> >> > > <many-to-one class="AssemblyName.Models.School, AssemblyName" >> > > name="student" column="SchoolInfoRefId"/> >> > >> > > </class> >> > >> > > Classes: >> > > In School: public virtual IList<StudentSchoolEnrollment> >> > > students{get;set;} //initialized in the contructor >> > >> > > In Student: public virtual IList<StudentSchoolEnrollment> schools >> > > { get; set; } //initialized in the contructor >> > >> > > In StudentSchool: >> > >> > > public virtual School school {get; set;} >> > > public virtual Student student { get; set; } >> > >> > > To test it, I wrap the following in a session: >> > >> > > Student newOne = new Student(); >> > > NameOfRecordType newName = new NameOfRecordType(); >> > > newName.FirstName="TQ"; >> > > newName.LastName="White"; >> > > newName.FullName="TQ White II"; >> > >> > > newOne.Name = newName; >> > >> > > School newSchool = new School(); >> > > newSchool.LocalId = "School #1"; >> > >> > > StudentSchoolEnrollment newEnrollment = new >> > > StudentSchoolEnrollment(); >> > > newEnrollment.SchoolYear = "2010 and beyond"; >> > >> > > newOne.schools.Add(newEnrollment); >> > > newSchool.students.Add(newEnrollment); >> > >> > > session.Save(newSchool); >> > > session.Save(newOne); >> > > session.Save(newEnrollment); >> > >> > > If I remove the enrollment code (not removing xml), the school and >> > > student are persisted correctly. If this were my bad, old sql days, >> > > I'd be trying to figure out how to get private keys for school and >> > > student, but am pretty sure NH is supposed to do that for me. >> > >> > > Thanks for your help. >> > >> > > tqii >> > >> > > On Mar 12, 9:22 am, Diego Mijelshon <[email protected]> wrote: >> > > > You'll need to create an intermediate entity, and one-to-many >> > > relationships >> > > > to it from the School and Student classes. >> > >> > > > Diego >> > >> > > > On Fri, Mar 12, 2010 at 12:08, tqwhite <[email protected]> wrote: >> > > > > Is that a good way to title this? Do we have a better name for >> that >> > > > > object that has both foreign keys? >> > >> > > > > Anyway, I am using a set of externally designed data types. Among >> them >> > > > > is the connection between two of my entities, Schools and >> Students. >> > > > > Each student can attend many schools. Each school has many >> students. >> > > > > In addition, that period of attendance has a start and end date, >> etc. >> > >> > > > > I have constructed a mapping and it almost works. Two problems I >> need >> > > > > help with: >> > >> > > > > 1) I am getting an error, "Cannot insert the value NULL into the >> > > > > column RefId." It specifies the join table. RefId is the <id> >> column >> > > > > for this intermediate. I bet that the problem is that NH doesn't >> > > > > expect there to be an id on the joining table. >> > >> > > > > 2) I can't set said start and end dates because I can't find a way >> to >> > > > > address that intermediate object. >> > >> > > > > I considered the idea that I should initialize that object in the >> > > > > AddStudent() (and AddSchool()) method but the needed id keys don't >> > > > > exist yet. >> > >> > > > > I spent last night poring over my brand, new copy of NHibernate in >> > > > > Action (I LOVE THAT BOOK!), but can't find any advice. >> > >> > > > > Help! Please. >> > >> > > > > thanks, >> > > > > tqii >> > >> > > > > -- >> > > > > 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]>> >> > > <nhusers%[email protected]<nhusers%[email protected]> >> <nhusers%252bunsubscr...@googlegroup s.com>> >> > > > > . >> > > > > 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]<nhusers%[email protected]> >> <nhusers%[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]<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]<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.
