私のシステムには、ShoppingCartとShoppingCartItemの2つのエンティティがあります。かなり一般的なユースケース。ただし、ShoppingCartを保存すると、どのアイテムもDBに保存されません。
オブジェクト内に、新しいShoppingCartオブジェクトを作成します。
ShoppingCart cart = CreateOrGetCart();
次に、データベースから取得した既存の製品を最初に追加します。
cart.AddItem(product);
これは、アイテムをIListに追加するための単純なラッパーです。
public virtual void AddItem(Product product)
{
Items.Add(new ShoppingCartItem { Quantity = 1, Product = product });
}
次に、リポジトリでSaveOrUpdateを呼び出します
Repository.SaveOrUpdate(cart);
これは次のようになります:
public T SaveOrUpdate(T entity)
{
Session.SaveOrUpdate(entity);
return entity;
}
マッピングにFluentNHibernateを使用しています。
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();
}
データベーススキーマ(SQL Server 2005)もかなり一般的です。
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
ShoppingCartをSaveOrUpdateすると、ShoppingCartItemsも保存されないのはなぜですか?
助けてください。
ありがとう
ベン
更新:トランザクションでラップすると、さらに情報が得られます:
列'ShoppingCartId'、テーブル'WroxPizza.dbo.ShoppingCartItems'に値NULLを挿入できません。列はnullを許可しません。INSERTは失敗します。ステートメントは終了されました。
これは新しいカートだからです。