0

FluentNHibernateとNHibernate.Core3ベータ1を使用しています。2つのクラスがあります。

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 に答える