我有两个实体: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()
的好资源,我将非常感激: - )
更新
我还注意到,join-table中的两个ID列未设置为主键。当我设法在其中插入相等的行时,我注意到了这一点。我该如何避免这种情况?这是我应该Set
使用Bag
的情况吗?
我在Bag vs Set上读过一些内容,对我来说似乎Set也许会解决我的“独特排”问题,但是,由于这只是一个连接表,我最关心的是能够删除“连接”,并从ContactInfo
删除Group
。
我尝试删除评论中提到的Cascade语句,但在删除时没有任何区别。
更新新
在做了一些调试之后,我注意到当我打电话给this.Groups.Remove(group)
时没有任何反应。原因是什么?或者..我检查了“立即窗口”中的哈希码,它们不相等。我做错了什么或者我只需要覆盖equals()?
解决方案
覆盖群组的Equals和ContactInfo解决了它!是否有任何规则说我应该总是为NHibernate实体覆盖它?
答案 0 :(得分:1)
我没有多对多,但我会尝试从
更改级联Cascade.All()
到
Cascade.AllDeleteOrphan()
关于Cascades的良好链接:Ayende on Cascades
对于一对多,如果你从集合中删除一个对象,NHibernate会调用一个删除对象。对于多对多,我认为它会在连接表上调用删除,但不是100%肯定。
答案 1 :(得分:0)
只是为了能够将此标记为已解决。有关更多详细信息,请参阅问题。
覆盖群体的等于和 ContactInfo解决了它!有没有 规则说我应该永远 为NHibernate实体覆盖它?