SaveOrUpdate () на автоматически отображаемом родителе устанавливает все дочерние внешние ключи в NULL - PullRequest
0 голосов
/ 09 декабря 2010

Я использую 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 [PromotionEntrant] SET PromotionId = null WHERE PromotionId = @p0;@p0 = 1 [Type: Int32 (0)]

Как мне предотвратить это?

Мое единственное предположение состоит в том, что он видит пустой список List в объекте Promotion (создан ASP.NET MVC и, следовательно, не привязан к сеансу NH), принимая это за отсутствие дочерних PromotionEntrants. Чтобы попытаться предотвратить это, я создал следующее переопределение автоматического сопоставления, но это не имеет значения.

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

Любая помощь будет высоко ценится.

1 Ответ

1 голос
/ 09 декабря 2010

Убедитесь, что PromotionEntrant.Promotion действительно указывает на продвижение. Учитывая, что это двусторонние отношения, отношения управляются с дочерней стороны отношений. Со стороны родителей у вас будет коллекция inverse = true.

Кстати - вы действительно должны запустить свой код в транзакции. Если вы уже, NhSession.Flush () является излишним.

...