在Fluent NHibernate中使用引用(多对一)在两端、多端和一端创建外键

在Fluent NHibernate中使用引用(多对一)在两端、多端和一端创建外键,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,正如标题所说,我想使用Fluent NHibernate创建多对一关系。存在属于组的GroupEntries。组本身可以有另一个组作为其父组 这些是我的实体: public class GroupEnty : IGroupEnty { public virtual long Id { get; set; } public virtual string Name { get; set; } ... public virtual IGroup Group { get;

正如标题所说,我想使用Fluent NHibernate创建多对一关系。存在属于组的GroupEntries。组本身可以有另一个组作为其父组

这些是我的实体:

public class GroupEnty : IGroupEnty
{
    public virtual long Id { get; set; }
    public virtual string Name { get; set; }
    ...
    public virtual IGroup Group { get; set; }
}

public class Group : IGroup
{
    public virtual long Id { get; set; }
    public virtual string Name { get; set; }
    ...
    public virtual IGroup Parent { get; set; }
}
这些是映射文件:

public class GroupEntryMap : ClassMap<GroupEntry>
{
    public GroupEntryMap()
    {
        Table(TableNames.GroupEntry);
        Id(x => x.Id).GeneratedBy.Native();
        Map(x => x.Name).Not.Nullable();
        ...
        References<Group>(x => x.Group);
    }
}

public class GroupMap : ClassMap<Group>
{
    public GroupMap()
    {
        Table(TableNames.Group);
        Id(x => x.Id).GeneratedBy.Native();
        Map(x => x.Name).Not.Nullable();
        ...
        References<Group>(x => x.Parent);
    }
}
我不知道为什么它会在“Group”表中创建列“GroupEntry\u id”。我只是在映射关系的另一面。我的配置中是否有错误,或者这是一个bug? “GroupEntry_id”是使用“notnull”约束创建的,这给我带来了很多麻烦,否则我可能不会在意

我真的很感谢在这方面的任何帮助,它已经困扰了我一段时间了,我找不到任何有类似问题的帖子


编辑:我不想创建双向关联

如果您想要多对一,其中一个组有多个组条目,我希望您的模型如下所示:

    public class GroupEntry : IGroupEntry
    {
       public virtual long Id { get; set; }
       public virtual string Name { get; set; }
        ...
       public virtual IGroup Group { get; set; }
    }

    public class Group : IGroup
    {
       public virtual long Id { get; set; }
       public virtual string Name { get; set; }
        ...
       public virtual IList<GroupEntry> GroupEntries { get; set; }
       public virtual IGroup Parent { get; set; }
    }
公共类GroupEntry:IGroupEntry
{
公共虚拟长Id{get;set;}
公共虚拟字符串名称{get;set;}
...
公共虚拟IGroup组{get;set;}
}
公共类组:IGroup
{
公共虚拟长Id{get;set;}
公共虚拟字符串名称{get;set;}
...
公共虚拟IList组条目{get;set;}
公共虚拟i组父项{get;set;}
}
请注意,该组有一个GroupEntry对象列表。你说:

我不知道为什么它会在“Group”表中创建列“GroupEntry\u id”。我只是在映射关系的另一面

您需要映射关系的双方,即多方和单方。您的映射应该如下所示:

    public GroupEntryMap()
    {
        Table(TableNames.GroupEntry);
        Id(x => x.Id).GeneratedBy.Native();
        Map(x => x.Name).Not.Nullable();
        ...
        References<Group>(x => x.Group);  //A GroupEntry belongs to one Group
    }
}

public class GroupMap : ClassMap<Group>
{
    public GroupMap()
    {
        Table(TableNames.Group);
        Id(x => x.Id).GeneratedBy.Native();
        Map(x => x.Name).Not.Nullable();
        ...
        References<Group>(x => x.Parent);
        //A Group has-many GroupEntry objects
        HasMany<GroupEntry>(x => x.GroupEntries); 
    }
}
publicGroupEntryMap()
{
表(TableNames.GroupEntry);
Id(x=>x.Id).GeneratedBy.Native();
Map(x=>x.Name).Not.Nullable();
...
引用(x=>x.Group);//一个GroupEntry属于一个组
}
}
公共类组映射:类映射
{
公共组映射()
{
表(TableNames.Group);
Id(x=>x.Id).GeneratedBy.Native();
Map(x=>x.Name).Not.Nullable();
...
参考文献(x=>x.Parent);
//一个组有许多GroupEntry对象
HasMany(x=>x.GroupEntries);
}
}

查看fluent以了解更多示例。

解决方案是我意外地为两个不同的实体指定了相同的表名。。。我真丢脸:(


非常感谢您的输入!

我应该提到我明确不想要双向关联。业务逻辑不需要双向关联,它只会在映射DTO时产生额外的开销。我在其他组件中使用双向关联,这很好,但我也使用单向关联我不明白为什么NHibernate在这两个实体中都创建了一个外键。我刚刚在NHibernate网站上找到了一个示例,它与我想了解的完全相同:博客作者协会反映了我的情况,我找不到任何差异。我查看了链接你发帖了,但是由于作者没有把他的表发帖,我不确定他是否也有不必要的外键问题。不过我很高兴你发现了,我被难住了。
    public GroupEntryMap()
    {
        Table(TableNames.GroupEntry);
        Id(x => x.Id).GeneratedBy.Native();
        Map(x => x.Name).Not.Nullable();
        ...
        References<Group>(x => x.Group);  //A GroupEntry belongs to one Group
    }
}

public class GroupMap : ClassMap<Group>
{
    public GroupMap()
    {
        Table(TableNames.Group);
        Id(x => x.Id).GeneratedBy.Native();
        Map(x => x.Name).Not.Nullable();
        ...
        References<Group>(x => x.Parent);
        //A Group has-many GroupEntry objects
        HasMany<GroupEntry>(x => x.GroupEntries); 
    }
}