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

标签 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() 的好资源,我将不胜感激 :-)

更新:

我还注意到连接表中的两个 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/

相关文章:

c# - 在两行列表框中从文本框中添加相同的字符串?

c# - 在达到特定字符之前如何获取字符?

c# - 从 FieldInfo 获取容器类实例

c# - CustomType 对 FluentNHibernate 的引用

c# - 无法加载类型 'NHibernate.ByteCode.CaSTLe.ProxyFactoryFactory, NHibernate.ByteCode.CaSTLe'

nhibernate - 将 TimeSpan 属性保存到时间类型 Mysql 列时出错

c# - 从 ajax 一次返回一项

nhibernate - 使用 NHibernate 查询字符串集合

nhibernate - 无法解析属性 : Id

join - 从数据库中获取带有连接实体的整个实体并避免延迟加载,nHibernate QueryOver