1

次のマッピングがありますが、ステータスエンティティを削除すると、Nhibernate は削除ではなく子で更新を実行します。

public StatusMap()
{
    Property(x => x.Date);
    Property(x => x.Text, map => map.Type(NHibernateUtil.StringClob));
    Property(x => x.Type);         
    ManyToOne(x => x.User, map => map.Column("UserId"));            
    Bag(x => x.Comments, map => { map.Key(km => km.Column("StatusId")); }, action => action.OneToMany());

    Bag(x => x.Likes, map => { map.Key(km => km.Column("StatusId"));  map.Cascade(Cascade.DeleteOrphans);  }, action => action.OneToMany());
}


public StatusLikeMap()
{
    ManyToOne(x => x.User, map => map.Column("UserId"));
    ManyToOne(x => x.Status, map => { map.Column("StatusId");  });
    Property(x => x.Date);
}

Delete(status) 結果は次の SQL になります。

UPDATE
    CommentStatus 
SET
    StatusId = null 
WHERE
    StatusId = @p0;
@p0 = ce350d55-e476-4874-9e95-341cad9342e2 [Type: Guid (0)]


UPDATE
    StatusLike 
SET
    StatusId = null 
WHERE
    StatusId = @p0;
@p0 = ce350d55-e476-4874-9e95-341cad9342e2 [Type: Guid (0)]


DELETE 
FROM
    Status 
WHERE
    Id = @p0;
@p0 = ce350d55-e476-4874-9e95-341cad9342e2 [Type: Guid (0)]

何か案が ??お願い助けて !

編集:

以下の変更を行い、除外は機能しますが、この方法では、削除コマンドを実行するデータベースです。

nhibernate にデータベースの代わりに削除を実行させるにはどうすればよいですか?

Bag(p => p.Likes, map =>
{
   map.Key(k =>
   {
      k.Column("StatusId");
      k.OnDelete(OnDeleteAction.Cascade);
    });
    map.Cascade(Cascade.DeleteOrphans);
    map.Inverse(true);
 }, ce => ce.OneToMany());
4

1 に答える 1

1

Cascade.DeleteOrphans は、孤児が削除されるとだけ言っています。親が削除されたときに子も削除されるという意味ではありません。

「削除」または「すべて」もカスケードする必要があります。

map.Cascade(Cascade.All | Cascade.DeleteOrphans)
于 2012-05-22T05:52:12.347 に答える