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

时间:2012-03-30 14:29:58

标签: nhibernate fluent-nhibernate

正如标题所说,我想使用Fluent NHibernate创建多对一关系。 GroupEntries属于Group。本集团本身可以将另一个集团作为其母公司。

这些是我的实体:

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);
    }
}

通过这种配置,Fluent NHibernate创建了这些表:

GroupEntry
bigint Id     string Name     ...     bigint Group_id

Group
bigint Id     string Name     ...     bigint Parent_id     bigint GroupEntry_id

我不知道为什么它会在“Group”表中创建“GroupEntry_id”列。我只是映射关系的另一面。我的配置是否有错误或这是一个错误? 使用“非空”约束创建“GroupEntry_id”这一事实给我带来了很多麻烦,否则我可能不在乎。

我真的很感激任何有关这方面的帮助,它一直困扰我一段时间,我找不到任何类似问题的帖子。

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

2 个答案:

答案 0 :(得分:2)

如果你想要一个群组有多个群组条目的多对一,我希望你的模型看起来像这样:

    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对象的列表。你说:

  

我不知道为什么它会在“Group”表中创建“GroupEntry_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); 
    }
}

查看流畅的wiki了解更多示例。

答案 1 :(得分:0)

解决方案是我不小心为两个不同的实体分配了相同的表名...对我感到羞耻:(

非常感谢输入!