C# 尝试删除多对多关系中两个对象之间的连接时出现的问题

C# 尝试删除多对多关系中两个对象之间的连接时出现的问题,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我有两个实体:Group和ContactInfo。它们通过多对多关系(使用Fluent NHibernate映射)连接 我无法从组中删除“联系人信息”。联接表未更新。(在插入新元素时为) 我的代码(节选): 公共类组映射:类映射 { 公共组映射() { Id(x=>x.GroupID); Map(x=>x.GroupName).Not.Nullable(); 引用(x=>x.Function); HasManyToMany(x=>x.Contacts) .Inverse() .Cascade.A

我有两个实体:Group和ContactInfo。它们通过多对多关系(使用Fluent NHibernate映射)连接

我无法从组中删除“联系人信息”。联接表未更新。(在插入新元素时为)

我的代码(节选):

公共类组映射:类映射
{
公共组映射()
{
Id(x=>x.GroupID);
Map(x=>x.GroupName).Not.Nullable();
引用(x=>x.Function);
HasManyToMany(x=>x.Contacts)
.Inverse()
.Cascade.All()//尝试了Cascade.alldelete孤儿()
.Not.LazyLoad()
.WithTableName(“联系人”);
}
}
公共类映射:类映射
{
公共地图()
{
Id(x=>x.ContactInfoID);
引用(x=>x.ContactInfoType).Not.Nullable().Not.LazyLoad();
Map(x=>x.ContactInfoValue).Not.Nullable();
参考资料(x=>x.Person)
.Not.LazyLoad();
HasManyToMany(x=>x.Groups)
.Cascade.All()//尝试了Cascade.alldelete孤儿()
.Not.LazyLoad()
.WithTableName(“联系人”);
}
}
//辅助方法
公共虚拟void RemoveFromGroup(组)
{
此.Groups.Remove(组);
组。联系人。删除(此);
}
//删除
contactInfo.RemoveFromGroup(组);
m_contactinformationepository.Update(ci);
对我做错了什么有什么建议吗?另外,如果有人有关于如何避免大量
.Not.LazyLoad()
的好资源,我将非常感谢:-)

更新:

我还注意到联接表中的两个ID列没有设置为主键。当我设法在其中插入相等的行时,我注意到了这一点。我如何避免这种情况?在这种情况下,我应该使用
设置
而不是

我已经读了一些关于Bag vs Set的文章,对我来说,Set可能会解决我的“唯一行”问题,但是,由于这只是一个连接表,我最关心的是能够删除“连接”,并从
组中删除
联系人信息

我尝试删除评论中提到的Cascade语句,但在删除时没有任何区别

更新新内容

在做了一些调试之后,我注意到当我调用
this.Groups.Remove(group)
时,什么都没有发生。原因何在?或者..我检查了“即时窗口”中的哈希代码,它们不相等。我做错了什么,还是只需要重写equals()

解决方案


覆盖组和ContactInfo的相等项解决了这个问题!是否有任何规则规定我应该始终为NHibernate实体重写它?

我没有做过多对多,但我会尝试将级联从

Cascade.All()

关于级联的好链接:


对于一对多,如果从集合中删除对象,NHibernate将调用对子对象的删除。对于多对多,我认为它会调用联接表上的delete,但不是100%确定。

只是为了能够将此标记为已解决。有关更多详细信息,请参见问题

重写组和 ContactInfo解决了这个问题!有吗 规则说我应该永远 为NHibernate实体覆盖它


谢谢你,艾斯顿!我现在已经阅读了这篇文章,并尝试切换到Cascade.AllDeleteOrphan()。但是它不起作用,联接表保持不变。对不起,我不确定它是否会。希望你能找到答案。谢谢你的输入!我尝试了这个(也更新了问题),但没有任何运气。在再次阅读流利的nhibernate教程之后,我真的很困惑。我看不出有什么区别。但是,其他关系会导致问题吗?ContactInfo和Group与其他实体都有References()关系。
Cascade.All()
Cascade.AllDeleteOrphan()