【问题标题】:NHibernate: Using Fluent Nhibernate to save child objectsNHibernate:使用 Fluent Nhibernate 保存子对象
【发布时间】:2010-10-06 05:09:35
【问题描述】:

在我的系统中,我有两个实体 - ShoppingCart 和 ShoppingCartItem。相当通用的用例。但是,当我保存我的 ShoppingCart 时,没有任何项目被保存到数据库中。

在我的对象中,我创建了一个新的 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;
    }

我正在使用 Fluent NHibernate 进行映射:

    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 时,为什么没有任何 ShoppingCartItems 也被保存?

请帮忙。

谢谢

更新: 将其包装在交易中,为我提供更多信息:

无法将值 NULL 插入“ShoppingCartId”列,表 'WroxPizza.dbo.ShoppingCartItems';列不允许空值。 插入失败。声明已终止。

这是因为这是一辆新购物车。

【问题讨论】:

  • James Gregorys 解决方案对我有用。

标签: nhibernate fluent-nhibernate nhibernate-mapping


【解决方案1】:

尝试将 Session.SaveOrUpdate 包装在事务中,或者在之后直接强制刷新。

【讨论】:

    【解决方案2】:

    我不确定,但我不认为 N​​Hibernate 将对象的保存级联到子对象。您没有显示调用 SaveOrUpdate 的代码,但我知道如果您此时遍历 ShoppingCartItems,分别保存每个,那么它们也会被持久化。

    【讨论】:

      【解决方案3】:

      我对 NHibernate一无所知(我使用的 OPF 为我做这件事),但是当您保存聚合根 (ShoppingCart) 时,代码是否也应该复合地提交它也拥有会话的实例?

      【讨论】:

        【解决方案4】:

        您的购物车商品是否有可能先保存,然后再保存?因此子项没有可用的父 ID?

        您可能需要在创建时将购物车显式保存回数据库,然后将商品添加到其中并保存 - 只是为了获取 ID。

        【讨论】:

          【解决方案5】:

          你为什么在行中包含.Cascade.SaveUpdate()

          References(x => x.Cart, "ShoppingCartId").Cascade.SaveUpdate()
          

          ?

          也许它让 NHibernate(或 Fluent NHibernate)感到困惑,您的关系两端似乎存在级联保存/更新?

          将您的 HasMany 配置为级联应该足以实现您想要的。

          【讨论】:

            【解决方案6】:

            我在使用流畅的 nhibernate 时遇到了这个确切的问题。映射一对多关系似乎存在一个小错误,并且关系不会自动保存或级联。 See here for a posting about it on the Fluent NHibernate group.

            显然,有人正在解决这个问题!

            我不能肯定地说这是您的代码的问题,但 it looks very similar to a problem I had。希望对大家有所帮助!

            【讨论】:

              【解决方案7】:

              问题在于你的 sessionfactory 配置语句。如果您希望您的数据保持不变,请不要使用 Exposeconfiguration。这肯定会解决您的数据持久性问题。

              【讨论】:

                【解决方案8】:

                如前所述,您(在数据库模式中)使用 Identity 定义字段,因此,必须在 Map 文件中设置这些字段。示例如下:

                Id(x =&gt; x.ID, "ShoppingCartItemId").GeneratedBy.Identity();

                您遇到的错误是因为您没有将映射中的 Identity 字段设置为由 Identity 生成,因此,当您尝试 Save() 时,不会生成 Identity 列(并且在数据库)然后它会给你错误。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-10-13
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-06-26
                  • 2011-10-26
                  相关资源
                  最近更新 更多