Excellent! I think I have everything working now.. Thanks so much for your help, and Pete as well..
Mike On Tue, Jan 21, 2014 at 12:14 PM, Fran Knebels <[email protected]> wrote: > yes. or expose it in your constructor for the line item. > > > On Tue, Jan 21, 2014 at 3:05 PM, Mike Christensen <[email protected]>wrote: > >> I was under the impression that this was taken care of automatically by >> NHibernate. In other words: >> >> dbList.Items.Add(newItem); >> >> Would automatically set: >> >> newItem.ShoppingList = dbList; >> >> Since I added it to dbList's Items collection. >> >> So, what you're saying is this has to be done by me (or through a add >> function that I create)? If so, that's fine - I just want to make sure >> this is by design and not due to improper mappings. Thanks! >> >> Mike >> >> >> On Tue, Jan 21, 2014 at 12:01 PM, Fran Knebels <[email protected]>wrote: >> >>> that's because you haven't made a link from the child to the parent. >>> >>> when adding records to child lists in nhibernate it is common to add >>> both add/remove functions that manage the lists. Here's an example using a >>> child collection of ContactInformation. >>> >>> public virtual void AddContactInformation(ContactInformation >>> contactInformation) >>> { >>> if (ContactInformation.Contains(contactInformation)) >>> return; >>> >>> contactInformation.Contact = this; >>> ContactInformation.Add(contactInformation); >>> } >>> >>> public virtual void RemoveContactInformation(ContactInformation >>> contactInformation) >>> { >>> if (!ContactInformation.Contains(contactInformation)) >>> return; >>> >>> ContactInformation.Remove(contactInformation); >>> } >>> >>> >>> >>> >>> On Tue, Jan 21, 2014 at 2:38 PM, Mike Christensen <[email protected]>wrote: >>> >>>> Looks like this almost works.. Setting the initial ID to Guid.Empty >>>> definitely makes the problem go away.. I also set the mapping as: >>>> >>>> HasMany(x => x.Items) >>>> .KeyColumn("ShoppingListId") >>>> .Inverse() >>>> .Cascade.All(); >>>> >>>> Now I can add the item as such: >>>> >>>> dbList.Items.Add(new ShoppingListItems >>>> { >>>> Raw = source.Raw, >>>> UserId = identity.UserId >>>> }); >>>> >>>> And it will create the new item. However, one small problem: The new >>>> item does NOT get linked to dbList. Its ShoppingListId property is left as >>>> null. >>>> >>>> Shouldn't adding a new item to dbList.Items make the ShoppingListId get >>>> set to the primary key of dbList? Or, do I have to manually specify this? >>>> Thanks! >>>> >>>> Mike >>>> >>>> >>>> On Tue, Jan 21, 2014 at 1:32 AM, Pete Appleton < >>>> [email protected]> wrote: >>>> >>>>> A few things that cross my mind: >>>>> >>>>> >>>>> >>>>> 1. You'll definitely need an appropriate Cascade style for the >>>>> "HasMany" mapping on ShoppingLists.Items, e.g. SaveUpdate - not sure which >>>>> mapping system you're using, so don't know the exact syntax >>>>> >>>>> 2. 99% of the time, this mapping should be 'Inverse' >>>>> >>>>> 3. It looks as you're manually assiging a new ID to the new >>>>> 'ShoppingListItems' object, which I suspect is causing NH to believe that >>>>> the new object is persistent. >>>>> >>>>> >>>>> >>>>> My general pattern for this sort of thing is as follows (pseudo-code >>>>> for interesting bits only): >>>>> >>>>> >>>>> >>>>> class ShoppingList { >>>>> >>>>> Guid Id { get; protected set; } >>>>> >>>>> ISet<ShoppingListItem> Items { get; protected set; } >>>>> >>>>> >>>>> >>>>> public ShoppingList() { >>>>> >>>>> this.Items = new … >>>>> >>>>> } >>>>> >>>>> } >>>>> >>>>> >>>>> >>>>> class ShoppingListLine { >>>>> >>>>> Guid Id { get; protected set; } >>>>> >>>>> public ShoppingList List { get; protected set; } >>>>> >>>>> >>>>> >>>>> ShoppingListLine(ShoppingList list) { >>>>> >>>>> this.List = list; >>>>> >>>>> this.List.Items.Add(this); >>>>> >>>>> } >>>>> >>>>> >>>>> >>>>> void Delete() { >>>>> >>>>> if(this.List != null) this.List.Items.Remove(this); >>>>> >>>>> this.List = null; >>>>> >>>>> } >>>>> >>>>> } >>>>> >>>>> >>>>> >>>>> var dbList = ….; >>>>> >>>>> var newItem = new >>>>> ShoppingListLine(dbList); // ctor >>>>> handles association maintenance >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> /Pete >>>>> >>>>> *From:* [email protected] [mailto:[email protected]] *On >>>>> Behalf Of *Mike Christensen >>>>> *Sent:* 21 January 2014 00:47 >>>>> *To:* nhusers >>>>> *Subject:* [nhusers] Adding a new item to a collection using Fluent >>>>> NHibernate doesn't INSERT the new row in the DB >>>>> >>>>> >>>>> >>>>> (StackOverflow question in case anyone wants >>>>> upvotes<http://stackoverflow.com/questions/21246584/adding-a-new-item-to-a-collection-using-fluent-nhibernate-doesnt-insert-the-new> >>>>> ) >>>>> >>>>> >>>>> >>>>> I have a model called `ShoppingLists` and each `ShoppingLists` has a >>>>> collection of `ShoppingListItems` called `Items`. What I would *like* to >>>>> be able to do is add a new item to my list as such: >>>>> >>>>> >>>>> >>>>> dbList.Items.Add(new ShoppingListItems(Guid.NewGuid(), >>>>> identity.UserId, source.Raw)); >>>>> >>>>> >>>>> >>>>> I would expect the `ShoppingListItems` to automatically be *linked* to >>>>> its parent `ShoppingLists` class, and for NHibernate to create the >>>>> appropriate SQL `INSERT` statement when the transaction is committed. >>>>> However, instead I get the exception: >>>>> >>>>> >>>>> >>>>> NHibernate.StaleStateException was unhandled >>>>> >>>>> HResult=-2146232832 >>>>> >>>>> Message=Unexpected row count: 0; expected: 1 >>>>> >>>>> Source=NHibernate >>>>> >>>>> >>>>> >>>>> What I have to do instead is create the object, save it, then add it >>>>> to the collection: >>>>> >>>>> >>>>> >>>>> var newItem = new ShoppingListItems(Guid.NewGuid(), >>>>> identity.UserId, source.Raw); >>>>> >>>>> newItem.ShoppingList = dbList; >>>>> >>>>> session.Save(newItem); >>>>> >>>>> dbList.Items.Add(newItem); >>>>> >>>>> >>>>> >>>>> I'd like to eliminate the need to do this. My mappings for >>>>> `ShoppingLists` is as such: >>>>> >>>>> >>>>> >>>>> Id(x => x.ShoppingListId); >>>>> >>>>> >>>>> >>>>> Map(x => x.UserId).Not.Nullable(); >>>>> >>>>> Map(x => x.Title).Not.Nullable(); >>>>> >>>>> >>>>> >>>>> HasMany(x => x.Items) >>>>> >>>>> .KeyColumn("ShoppingListId") >>>>> >>>>> .Cascade.Delete(); // If Shopping List is deleted, delete all >>>>> the Items that reference this list >>>>> >>>>> >>>>> >>>>> And my mappings for `ShoppingListItems` is: >>>>> >>>>> >>>>> >>>>> Id(x => x.ItemId); >>>>> >>>>> >>>>> >>>>> Map(x => x.Raw).Length(50); >>>>> >>>>> Map(x => x.Qty); >>>>> >>>>> Map(x => x.Unit); >>>>> >>>>> Map(x => x.UserId).Not.Nullable(); >>>>> >>>>> Map(x => x.CrossedOut).Not.Nullable(); >>>>> >>>>> >>>>> >>>>> References(x => x.Recipe).Column("RecipeId"); >>>>> >>>>> References(x => x.Ingredient).Column("IngredientId"); >>>>> >>>>> References(x => x.ShoppingList).Column("ShoppingListId"); >>>>> >>>>> >>>>> >>>>> I've tried playing around with `Cascade.All()` on each, to no avoid. >>>>> Any ideas? >>>>> >>>>> >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "nhusers" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to [email protected]. >>>>> To post to this group, send email to [email protected]. >>>>> Visit this group at http://groups.google.com/group/nhusers. >>>>> For more options, visit https://groups.google.com/groups/opt_out. >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "nhusers" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to [email protected]. >>>>> To post to this group, send email to [email protected]. >>>>> Visit this group at http://groups.google.com/group/nhusers. >>>>> For more options, visit https://groups.google.com/groups/opt_out. >>>>> >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "nhusers" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> To post to this group, send email to [email protected]. >>>> Visit this group at http://groups.google.com/group/nhusers. >>>> For more options, visit https://groups.google.com/groups/opt_out. >>>> >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "nhusers" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> To post to this group, send email to [email protected]. >>> Visit this group at http://groups.google.com/group/nhusers. >>> For more options, visit https://groups.google.com/groups/opt_out. >>> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "nhusers" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To post to this group, send email to [email protected]. >> Visit this group at http://groups.google.com/group/nhusers. >> For more options, visit https://groups.google.com/groups/opt_out. >> > > -- > You received this message because you are subscribed to the Google Groups > "nhusers" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/nhusers. > For more options, visit https://groups.google.com/groups/opt_out. > -- You received this message because you are subscribed to the Google Groups "nhusers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/nhusers. For more options, visit https://groups.google.com/groups/opt_out.
