自动映射父级上的SaveOrUpdate()将所有子外键设置为NULL

时间:2010-12-09 00:14:44

标签: nhibernate fluent-nhibernate asp.net-mvc-3 automapping

我正在使用Fluent NHibernate和NHibernate.Core 3 beta 1.我有两个类:

public class Promotion
{
    public Promotion()
    {
        PromotionEntrants = new List<PromotionEntrant>();
    }

    public virtual int Id { get; set; }        
    [Required]
    public virtual string Name { get; set; }
    ...
    public virtual IList<PromotionEntrant> PromotionEntrants { get; set; }
}

public class PromotionEntrant
{
    public virtual int Id { get; set; }
    ...
    public virtual Promotion Promotion { get; set; }
}

我正在使用自动映射,它会生成我期望的架构,而且大部分内容似乎都按预期工作。

我有以下操作(ASP.NET MVC 3 RC)来保存/创建促销:

[HttpPost]
public ActionResult SavePromo(Promotion promo)
{
    if (ModelState.IsValid)
    {
        // .SaveOrUpdateCopy(promo) results in the same SQL
        NhSession.SaveOrUpdate(promo);
        NhSession.Flush();
    }

    ...
}

这会执行预期的“update Promotion ...”查询,但它也会执行以下操作:

UPDATE [PromotionEntrant] SET PromotionId = null WHERE PromotionId = @p0;@p0 = 1 [Type: Int32 (0)]

如何防止这种情况发生?

我唯一的猜测是它看到了Promotion对象上的空List(由ASP.NET MVC构造,因此没有附加到NH Session),这意味着应该没有子PromotionEntrants。为了尝试防止这种情况,我创建了以下自动映射覆盖,但它没有什么区别。

public class PromotionMappingOverride : IAutoMappingOverride<Promotion>
{
    public void Override(AutoMapping<Promotion> mapping)
    {
        mapping.HasMany(p => p.PromotionEntrants)
            .Cascade.None();
    }
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

验证PromotionEntrant.Promotion实际上是否指向促销。鉴于这是双向关系,关系是从关系的子方面管理的。从父方面来看,你将有一个inverse = true集合。

顺便说一句 - 你真的应该在交易中运行你的代码。如果你已经,NhSession.Flush()是多余的。