正如标题所说,我想使用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”这一事实给我带来了很多麻烦,否则我可能不在乎。
我真的很感激任何有关这方面的帮助,它一直困扰我一段时间,我找不到任何类似问题的帖子。
编辑:我不想创建双向关联!
答案 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)
解决方案是我不小心为两个不同的实体分配了相同的表名...对我感到羞耻:(
非常感谢输入!