Fluent nHibernate多对多映射
本文关键字:映射 Fluent nHibernate | 更新日期: 2023-09-27 17:59:38
我正试图从表Group和Person中创建具有两个FK的实体。
public class Person
{
public virtual int p_id { get; set; }
public virtual string name { get; set; }
public virtual IList<Person> ppl { get; set; }
}
public class Group
{
public virtual int g_id { get; set; }
public virtual string name{ get; set;}
public virtual IList<Group> groups { get; set; }
}
多对多映射:
HasManyToMany(x => x.ppl)
.Table("gp")
.ParentKeyColumn("g_id")
.ChildKeyColumn("p_id");
HasManyToMany(x => x.groups)
.Table("gp")
.ParentKeyColumn("p_id")
.ChildKeyColumn("g_id")
.Inverse();
问题是gp表中的两个约束都引用了表person。显示创建表命令:
CREATE TABLE `gp` (
`g_id` int(11) NOT NULL,
`p_id` int(11) NOT NULL,
KEY `p_id` (`p_id`),
KEY `g_id` (`g_id`),
CONSTRAINT `FK4B9E89089BCCDC65` FOREIGN KEY (`g_id`) REFERENCES `person` (`p_id`),
CONSTRAINT `FK4B9E8908E34BCD9E` FOREIGN KEY (`p_id`) REFERENCES `person` (`p_id`)
想要:
CREATE TABLE `gp` (
`g_id` int(11) NOT NULL,
`p_id` int(11) NOT NULL,
KEY `p_id` (`p_id`),
KEY `g_id` (`g_id`),
CONSTRAINT `FK4B9E89089BCCDC65` FOREIGN KEY (`g_id`) REFERENCES `group` (`g_id`),
CONSTRAINT `FK4B9E8908E34BCD9E` FOREIGN KEY (`p_id`) REFERENCES `person` (`p_id`)
我试图删除组映射中的Inverse(),并在person表中使用它,但我得到了以下异常:"关系两边都指定了Inverse"。有人知道为什么约束引用一个表吗?
我有这个:
-
我没有"反转"。
-
你有(单数)
.ParentKeyColumn("p_id") .ChildKeyColumn("g_id")
我已经添加到收藏中,也许可以尝试一些东西。
.ParentKeyColumns.Add("p_id")
.ChildKeyColumns.Add("g_id")
(and vice versa)
以下是我的2个映射(与我的世界不同,其中员工有停车区,反之亦然)。。。。。。。。。。。。
/* the below is how to do it without a surogatekey on the link table */
HasManyToMany<ParkingAreaNHEntity>(x => x.MyParkingAreas)
.Table("EmployeeToParkingAreaLink")
.ParentKeyColumns.Add("AbcEmployeeUUID", p => p.UniqueKey("Emp_ParkingArea_Unique").Index("IX_ABC123"))
.ChildKeyColumns.Add("AbcParkingAreaUUID", p => p.UniqueKey("Emp_ParkingArea_Unique"))
.Cascade.None()
;
/* the below is how to do it without a surogatekey on the link table */
HasManyToMany<EmployeeNHEntity>(x => x.MyEmployees)
.Table("EmployeeToParkingAreaLink")
.ParentKeyColumns.Add("AbcParkingAreaUUID", p => p.UniqueKey("Emp_ParkingArea_Unique").Index("IX_ABC123"))
.ChildKeyColumns.Add("AbcEmployeeUUID", p => p.UniqueKey("Emp_ParkingArea_Unique"))
.Cascade.None()
;
找到的解决方案:
HasManyToMany(x => x.ppl)
.Table("gp")
.ChildKeyColumns.Add("p_id");
HasManyToMany(x => x.groups)
.Table("gp")
.ChildKeyColumns.Add("g_id")