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

时间:2009-07-02 08:50:57

标签: c# nhibernate fluent-nhibernate

我有两个实体: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实体覆盖它?

2 个答案:

答案 0 :(得分:1)

我没有多对多,但我会尝试从

更改级联
Cascade.All()

Cascade.AllDeleteOrphan()

关于Cascades的良好链接:Ayende on Cascades

对于一对多,如果你从集合中删除一个对象,NHibernate会调用一个删除对象。对于多对多,我认为它会在连接表上调用删除,但不是100%肯定。

答案 1 :(得分:0)

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

  

覆盖群体的等于和   ContactInfo解决了它!有没有   规则说我应该永远   为NHibernate实体覆盖它?