流利的NHibernate一对多不能拯救孩子

时间:2011-07-14 14:37:59

标签: nhibernate fluent-nhibernate

我正在使用Fluent NHibernate。这是一对多关系的经典案例。我有一个包含许多SupplyAmount子项的Supply父级。

Supply父对象正在使用正确的信息进行保存,但是在保存父项时,金额未插入到数据库中。我怎么做级联不工作?

实体如下:

public class Supply : BaseEntity
{
    public Guid SupplyId    { get; set; }
    public string LastName      { get; set; }
    public string FirstName     { get; set; }
    public string Comments      { get; set; }
    public virtual IList<SupplyAmount> Amounts { get; set; }

    public Supply()
    {
        Amounts = new List<SupplyAmount>();
    }

    public virtual void AddAmount(SupplyAmount amount)
    {
        amount.Supply = this;
        Amounts.Add(amount);
    }
}


public class SupplyAmount : BaseEntity
{
    public virtual Guid SupplymountId { get; set; }
    public virtual Supply Supply { get; set; }
    public virtual int Amount { get; set; }
}

映射如下:

public class SupplyMap : ClassMap<Supply>
{
    public SupplyMap()
    {
        Id(x => x.SupplyId);
        Map(x => x.LastName);
        Map(x => x.FirstName);  
        Map(x => x.Comments);

        HasMany<SupplyAmount>(x => x.Amounts)
            .Inverse().Cascade.SaveUpdate()
            .KeyColumn("SupplyAmountId")
            .AsBag();
    }
}


public class SupplyAmountMap : ClassMap<SupplyAmount>
{
    public SupplyAmountMap()
    {
        Id(x => x.SupplyAmountId);
        References(x => x.Supply, "SupplyId").Cascade.SaveUpdate();
        Map(x => x.Amount);
    }
}

这就是我所说的:

    public SaveIt()
    {
        Supply sOrder = Supply();

        sOrder.FirstName = "TestFirst";
        sOrder.LastName = "TestLast";
        sOrder.Comments = "TestComments";

        for (int i = 0; i < 5; i++)
        {
            SupplyAmount amount = new SupplyAmount();
            amount.Amount = 50;
            amount.Supply = sOrder;
            sOrder.AddAmount(amount);
        }

        // This call saves the Supply to the Supply table but none of the Amounts
        // to the SupplyAmount table.
        AddSupplyOrder(sOrder);
    }

1 个答案:

答案 0 :(得分:0)

我知道这是一个老帖子,但为什么不...

// This call saves the Supply to the Supply table but none of the Amounts

SaveIt()中的此注释表示您调用Supply上的保存而不是金额。 在这种情况下,你的逻辑错误。

所以解决这个问题:

SupplyMap - &gt;对于金额,逆量不应该存在。

HasMany<SupplyAmount>(x => x.Amounts).Cascade.SaveUpdate();

SupplyAmountMap - &gt; 删除引用(x =&gt; x.Supply,“SupplyId”)。Cascade.SaveUpdate(); 替换为

References<Supply>(x=>x.Supply);

您现在应该只对供应对象上的保存进行调用,它将级联到金额。

Session.Save(supply);

在您安排供应和供应量之后的测试中,请确保拨打电话     调用Session.flush() 保存后强制进入。 这在代码中并不重要,因为在调用供应对象之前通常会在事务中运行。

干杯, 巧克力

另外作为旁注,通过流畅的映射来表达通常不是一个好主意。让默认的东西做这件事,这就是为什么我会建议反对列命名提示。