c# - 在 Fluent NHibernate 自动映射中自引用多对多关系自动映射到 1 :n and not n:n

标签 c# .net nhibernate fluent-nhibernate

标题几乎解释了一切,我有一个成员对象,它引用了也是成员类型的“ friend ”。

public class Member : Entity
    {
        public Member()
        {            
            Friends = new List<Member>();
        }

        public virtual IList<Member> Friends
        {
            get; set;
        }
     }

模式生成工具使其成为 1:n 关系,而它应该是 n:n 关系,即在成员表中添加一个名为 member_id 的列,并且不创建连接表。

有什么方法可以在 Fluent NHibernate 中创建一个引用多对多关系的 Self 吗?

我尝试使用我之前得到的覆盖作为答案:

public class MemberOverride : IAutoMappingOverride<Member>
{
    public void Override(AutoMapping<Member> mapping)
    {
        mapping.HasManyToMany(m => m.Friends)
               .Table("MemberFriendsLinkTable");
    }
}

但我收到错误信息:

“NHibernate.MappingException:集合映射中的重复列:Proj.BO.Member.Friends 列:Member_id”

谢谢

编辑:我找到了答案,它是:

mapping.HasManyToMany(m => m.Friends).ParentKeyColumn("Member_Id").ChildKeyColumn("Friend_Id")
                   .Table("MemberFriendsLinkTable").Inverse().Cascade.SaveUpdate();

最佳答案

这样我就不必再在“未回答的 NHibernate 问题”列表的顶部看到这个问题...

提问者 Eitan 发现了解决他自己问题的方法。他需要像这样指定 ParentKeyColumnChildKeyColumn:

EDIT: I found the answer, it's to put:

mapping.HasManyToMany(m => m.Friends)
    .ParentKeyColumn("Member_Id")
    .ChildKeyColumn("Friend_Id")
    .Table("MemberFriendsLinkTable")
    .Inverse()
    .Cascade.SaveUpdate();

FluentNHibernate 默认命名外键列如下:{className}_Id。由于多对多的两端属于同一类型,因此它希望对两列使用相同的列名 Member_Id。明确命名列可避免此问题。

关于c# - 在 Fluent NHibernate 自动映射中自引用多对多关系自动映射到 1 :n and not n:n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5295780/

相关文章:

asp.net - HTTP 错误 403.14 - 禁止在 Windows 7 上使用 visual studio 12 创建 Web 服务

c# - nhibernate nuget - 找不到架构

c#,使用 Nhibernate(QueryOver 或 Linq)预先加载集合集合返回 "cannot simultaneously fetch multiple bags"

nhibernate - 使用 NHIbernate 的强类型属性

c# - WPF C# 将音频文件复制到剪贴板

c# - .Net Core 2.1获取USB存储设备序列号

.net - .net 世界中的依赖注入(inject),无需 XML 配置文件

c# - 是否可以发布从 .net 框架获取并在线修改的代码?

c# - MVC Controller 的 AJAX 参数不是 NULL?

c# - TCP程序包大于MTU时,C#Socket.Receive()发生故障