gpt4 book ai didi

Nhibernate 不会从集合中删除 child

转载 作者:行者123 更新时间:2023-12-03 17:42:48 24 4
gpt4 key购买 nike

首先是映射,

<set name="Comments" table="cm_events_venue_comment" inverse="true"
lazy="true" generic="true" cascade="all-delete-orphan"
batch-size="10" order-by="dateCreated ASC">
<cache usage="read-write" />
<key column="venueId" />
<one-to-many class="VenueComment" />
</set>

通过测试,

[Test]
public void CanSaveAndDeleteComments()
{
User u = TestDataHelper.CreateUser("Sir", "Talkalot");
VenueComment comment;
Venue v = GetVenueById();

PerformInTransaction(() =>
{
userRepository.SaveOrUpdate(u);
comment = new VenueComment()
{
Commenter = u,
Text = "I like ifs and buts and i cannot lie..",
DateCreated = DateTime.Now
};
v.AddComment(comment);
comment = new VenueComment()
{
Commenter = u,
Text = "And words ending in 'ly'",
DateCreated = DateTime.Now
};
v.AddComment(comment);
Assert.DoesNotThrow(()=>venueRepository.SaveOrUpdate(v));
});

// Test retrieval
Session.Evict(v);

v = GetVenueById();
v.Comments.Count.ShouldEqual(2);
var c = v.Comments.FirstOrDefault<VenueComment>();
c.Commenter.Id.ShouldEqual(u.Id);

// and deletion
PerformInTransaction(() =>
{
v.RemoveComment(c);
});

Session.Evict(v);
v = GetVenueById();
v.Comments.Count.ShouldEqual(1);

}

我的问题出在我的应用程序的 Controller 上,

[Authenticate, AcceptAjax]
public ActionResult DeleteComment(int id)
{
return PerformInTransaction<ActionResult>(() =>
{
var comment = commonDao.GetObjectById<VenueComment>(id);
if (comment == null)
return JsonFailure("Comment not found");

if (comment.Commenter.Id == CurrentUser.Id ||
AuthUtil.IsAdministrator()) //
{

var venue = comment.Venue;
venue.RemoveComment(comment);

return JsonSuccess(id);
}
return JsonFailure("You can only delete comments you created.");
});
}

根据 Log4Net,没有发布任何删除。正如我所说,上面的测试通过了,所以映射应该是正确的。

有什么线索吗?

最佳答案

如果您查看有关集合类型属性映射的 inverse 属性的文档,您会发现设置 inverse="false" 会指示 NHibernate 监视更改集合的父对象(包含集合的对象),并根据对父子集合的添加/删除来插入/删除子对象。

但是,当您设置 inverse="true" 时,您是在指示 NHibernate 监视子对象以查看对返回父对象的引用属性的更改。因此,当您设置子项的 parent-reference 属性时,NHibernate 将去修改关联。

看起来您不想在父级的子级集合上设置 inverse="true"

附录:

RemoveComment 可以取消父项与子项的关联(如设置 child.Parent = null)。但是,如果它还没有解除子项与 Session 的关联,并且如果集合被标记为 inverse="true",则表明子项拥有关联而不是集合拥有关联,那么 NHibernate 将不会发送 delete。如果对象应该被删除,NHibernate 只会发送一个 delete - a) 如果一个集合拥有关联(inverse="false")并且集合的级联是设置为包括删除并且对象从集合中删除,或者 b) 如果对象从 Session 中删除。

关于Nhibernate 不会从集合中删除 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1619234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com