Hello,
In my system, I have two entities - ShoppingCart and ShoppingCartItem. Fairly generic use-case. However, when I save my ShoppingCart, none of the items are being saved to the DB.
Within my object, I create a new ShoppingCart object. ShoppingCart cart = CreateOrGetCart();
I then add an existing Product which I got from the database to the start.
cart.AddItem(product);
This is just a simple wrapper to add the item to the IList.
    public virtual void AddItem(Product product)
    {
        Items.Add(new ShoppingCartItem { Quantity = 1, Product = product });
    }
I then call SaveOrUpdate on the Repository
Repository.SaveOrUpdate(cart);
Which looks like this:
   public T SaveOrUpdate(T entity)
    {
        Session.SaveOrUpdate(entity);
        return entity;
    }
I'm using Fluent NHibernate for the mapping:
    public ShoppingCartItemMap()
    {
        WithTable("ShoppingCartItems");
        Id(x => x.ID, "ShoppingCartItemId");
        Map(x => x.Quantity);
        References(x => x.Cart, "ShoppingCartId").Cascade.SaveUpdate();
        References(x => x.Product, "ProductId");
    }
    public ShoppingCartMap()
    {
        WithTable("ShoppingCarts");
        Id(x => x.ID, "ShoppingCartId");
        Map(x => x.Created);
        Map(x => x.Username);
        HasMany<ShoppingCartItem>(x => x.Items)
            .IsInverse().Cascade.SaveUpdate()
            .WithKeyColumn("ShoppingCartId")
            .AsBag();
    }
Database Schema (SQL Server 2005) is also fairly generic:
CREATE TABLE [dbo].[ShoppingCarts] ( [ShoppingCartID] [int] NOT NULL IDENTITY(1, 1), [Username] [nvarchar] (50) NOT NULL, [Created] [datetime] NOT NULL ) GO ALTER TABLE [dbo].[ShoppingCarts] ADD CONSTRAINT [PK_ShoppingCarts] PRIMARY KEY CLUSTERED ([ShoppingCartID]) GO
CREATE TABLE [dbo].[ShoppingCartItems] ( [ShoppingCartItemId] [int] NOT NULL IDENTITY(1, 1), [ShoppingCartId] [int] NOT NULL, [ProductId] [int] NOT NULL, [Quantity] [int] NOT NULL ) GO ALTER TABLE [dbo].[ShoppingCartItems] ADD CONSTRAINT [PK_ShoppingCartItems] PRIMARY KEY CLUSTERED ([ShoppingCartItemId]) GO ALTER TABLE [dbo].[ShoppingCartItems] ADD CONSTRAINT [FK_ShoppingCartItems_Products] FOREIGN KEY ([ProductId]) REFERENCES [dbo].[Products] ([ProductId]) GO ALTER TABLE [dbo].[ShoppingCartItems] ADD CONSTRAINT [FK_ShoppingCartItems_ShoppingCarts] FOREIGN KEY ([ShoppingCartId]) REFERENCES [dbo].[ShoppingCarts] ([ShoppingCartID]) GO
When I SaveOrUpdate my ShoppingCart, why isn't any ShoppingCartItems also being saved?
Please help.
Thanks
Ben
UPDATE: Wrapping it in a transaction providng me with some more info: {"Cannot insert the value NULL into column 'ShoppingCartId', table 'WroxPizza.dbo.ShoppingCartItems'; column does not allow nulls. INSERT fails.\r\nThe statement has been terminated."} This is because it's a new cart.