我正在使用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();
}
}
非常感谢任何帮助。
答案 0 :(得分:1)
验证PromotionEntrant.Promotion实际上是否指向促销。鉴于这是双向关系,关系是从关系的子方面管理的。从父方面来看,你将有一个inverse = true集合。
顺便说一句 - 你真的应该在交易中运行你的代码。如果你已经,NhSession.Flush()是多余的。