0

我正在使用 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 对象上的空列表(由 ASP.NET MVC 构造,因此未附加到 NH 会话),这意味着不应该有子 PromotionEntrants。为了尝试防止这种情况,我创建了以下自动映射覆盖,但它没有任何区别。

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

任何帮助将非常感激。

4

1 回答 1

1

验证 PromotionEntrant.Promotion 实际上指向促销活动。鉴于这是一个双向关系,该关系是从关系的子端管理的。从父方,您将拥有一个 inverse=true 集合。

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

于 2010-12-09T06:35:19.057 回答