Yeah, now i see, it confused me the many to many, if you have data in the joining object then you have two one to many for sure. I have a lot of working code with that configuration without any problem...
Can you write a test with the problem and send it to the group files? Gustavo. On Sat, Mar 13, 2010 at 2:25 PM, Diego Mijelshon <[email protected]>wrote: > 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]<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.
