我有两个实体:Group 和 ContactInfo。它们与多对多关系相连(使用 Fluent NHibernate 映射)。
我无法从群组中删除“ContactInfo”。连接表未更新。 (就是插入新元素的时候)
我的代码(摘录):
public class GroupMap : ClassMap<Group>
{
public GroupMap()
{
Id(x => x.GroupID);
Map(x => x.GroupName).Not.Nullable();
References(x => x.Function);
HasManyToMany(x => x.Contacts)
.Inverse()
.Cascade.All() // tried Cascade.AllDeleteOrphans()
.Not.LazyLoad()
.WithTableName("Contacts");
}
}
public class ConcactInfoMap : ClassMap<ContactInfo>
{
public ConcactInfoMap()
{
Id(x => x.ContactInfoID);
References(x => x.ContactInfoType).Not.Nullable().Not.LazyLoad();
Map(x => x.ContactInfoValue).Not.Nullable();
References(x => x.Person)
.Not.LazyLoad();
HasManyToMany(x => x.Groups)
.Cascade.All() // tried Cascade.AllDeleteOrphans()
.Not.LazyLoad()
.WithTableName("Contacts");
}
}
// The helper method
public virtual void RemoveFromGroup(Group group)
{
this.Groups.Remove(group);
group.Contacts.Remove(this);
}
// The deletion
contactInfo.RemoveFromGroup(group);
m_ContactInfoRepository.Update(ci);
对我做错了什么有什么建议吗?另外,如果有人有关于如何避免大量 .Not.LazyLoad()
的好资源,我将不胜感激 :-)
更新:
我还注意到连接表中的两个 ID 列未设置为主键。当我设法向其中插入相等的行时,我注意到了这一点。我该如何避免这种情况?在这种情况下,我应该使用 Set
而不是 Bag
吗?
我已经阅读了一些关于 Bag vs Set 的内容,在我看来 Set 可能会解决我的“唯一行”问题,但是,由于这只是一个连接表,我最关心的是能够删除“连接”,并从 Group
中删除 ContactInfo
。
我尝试删除评论中提到的 Cascade 语句,但在删除时没有任何区别。
更新新
在进行一些调试后,我注意到当我调用 this.Groups.Remove(group)
时没有任何反应。原因是什么?或者..我检查了“立即窗口”中的哈希码,它们不相等。我做错了什么还是我只需要重写 equals()?
解决方案
重写 Group 和 ContactInfo 的 Equals 解决了这个问题!是否有任何规则规定我应该始终为 NHibernate 实体覆盖它?
最佳答案
我没有做过多对多,但我会尝试改变级联
Cascade.All()
到
Cascade.AllDeleteOrphan()
有关 Cascades 的良好链接:Ayende on Cascades
对于一对多,如果您从集合中删除一个对象,NHibernate 将对子对象调用删除。对于多对多,我认为它会在连接表上调用删除,但我不是 100% 确定。
关于c# - 尝试删除多对多关系中两个对象之间的连接时出现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1073239/