我正在使用 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();
}
}
任何帮助将非常感激。