我拥有的是:
鉴于此,我希望通过以下测试:
[Test]
public void WhenDeletingChildMembershipShouldBeDeletedButNotParent()
{
var list = new Domain.List();
var child = new Domain.List();
var membership = new ListToListMembership()
{
Member = child,
};
list.SubLists.Add(membership);
Session.Save(list);
Session.Flush();
Session.Evict(list);
Session.Evict(child);
var childFromDb = Session.Linq<Domain.List>()
.FirstOrDefault(l => l.ID == child.ID);
Assert.IsNotNull(childFromDb, "child wasn't saved when the parent was saved");
Assert.AreNotSame(child, childFromDb, "child was pulled from cache not the db");
//This will allow it to pass, but I don't want to have to do this.
// foreach (var m in childFromDb.ParentLists)
// {
// m.List.SubLists.Remove(m);
// Session.Save(m.List);
// }
Session.Delete(childFromDb);
Session.Flush();
Session.Evict(childFromDb);
var membershipFromDb = Session.Linq<ListToListMembership>()
.FirstOrDefault(m => m.ID == membership.ID);
Assert.IsNull(membershipFromDb, "membership wasn't deleted");
var parentFromDb = Session.Linq<Domain.List>()
.FirstOrDefault(l => l.ID == list.ID);
Assert.IsNotNull(parentFromDb, "parent list was deleted");
}
基本上,当我创建一个列表并向其添加一个成员列表成员资格时,我希望自动创建成员资格和成员。
此外,当我删除父列表或成员列表时,我希望删除成员资格但不删除成员列表(如果父项被删除),也不删除父列表(如果成员列表为删除)。
Domain.List:
<!-- Other relevant fields -->
[HasMany(typeof(ListToListMembership),ColumnKey="ListId",
Cascade = ManyRelationCascadeEnum.AllDeleteOrphan)]
public IList<ListToListMembership> SubLists{
get;
set;
}
[HasMany(typeof(ListToListMembership),ColumnKey="MemberId",
Cascade = ManyRelationCascadeEnum.AllDeleteOrphan)]
public IList<ListToListMembership> ParentLists {
get;
set;
}
ListToListMembership:
<!-- other relevant fields -->
[BelongsTo("ListId",Cascade=CascadeEnum.SaveUpdate)]
public List List {
get;
set;
}
[BelongsTo("MemberId", Cascade = CascadeEnum.SaveUpdate)]
public List Member {
get;
set;
}
答案 0 :(得分:1)
这个案子相当复杂,我无法全部遵循。
可能是由级联引起的。我不知道你是如何映射这些类的。
我不确定你为什么需要这个ListToListMembership
课程。您可以通过简化域模型来摆脱它。数据库中仍然会有一个连接表,但这是由NH管理的。
然后我认为你试图在级联配置中加入太多逻辑。有时级联实际上是业务逻辑。如果对象的生命周期严格地耦合到另一个“父”对象,则是级联的情况。在任何更复杂的情况下,它应该作为业务逻辑的一部分来实现。 (因为对象将有自己的生命周期,需要由业务逻辑管理)