4.1通过设置外键映射关系
本文关键字:映射 关系 设置 1通 | 更新日期: 2023-09-27 17:54:43
如何告诉该死的实体框架将关系映射到想要的列!
I have 1 table:
public class ShedPart
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public int GroupId { get; set; }
public int ParentGroupId { get; set; }
public string GroupName { get; set; }
[ForeignKey("GroupId")]
[InverseProperty("ParentGroupId")]
public ICollection<Part> ParentParts { get; set; }
}
每个Part 可以有多个parentpart…
生成的SQL如下: SELECT
`Project1`.`Id`,
`Project1`.`Name`,
`Project1`.`GroupId`,
`Project1`.`ParentGroupId`,
`Project1`.`GroupName`,
`Project1`.`C1`,
`Project1`.`Id1`,
`Project1`.`Name1`,
`Project1`.`GroupId1`,
`Project1`.`ParentGroupId1`,
`Project1`.`GroupName1`
FROM (SELECT
`Extent1`.`Id`,
`Extent1`.`Name`,
`Extent1`.`GroupId`,
`Extent1`.`ParentGroupId`,
`Extent1`.`GroupName`,
`Extent2`.`Id` AS `Id1`,
`Extent2`.`Name` AS `Name1`,
`Extent2`.`GroupId` AS `GroupId1`,
`Extent2`.`ParentGroupId` AS `ParentGroupId1`,
`Extent2`.`GroupName` AS `GroupName1`
CASE WHEN (`Extent2`.`Id` IS NULL) THEN (NULL) ELSE (1) END AS `C1`
FROM `Parts` AS `Extent1` LEFT OUTER JOIN `Parts` AS `Extent2` ON `Extent1`.`Id` = `Extent2`.`GroupId`) AS `Project1`
ORDER BY
`Id` ASC,
`C1` ASC}
正如你所看到的,这是错误的,因为它是在Id => GroupId上加入表,当我试图通过ParentGroupId => GroupId加入。
所以我试试这个:
modelBuilder.Entity<Part>()
.HasMany(s => s.ParentParts)
.WithMany()
.Map(m =>
{
m.ToTable("parts");
m.MapLeftKey("GroupId");
m.MapRightKey("ParentGroupId");
});
做同样的事情.....似乎实体框架将只映射到关键列!如何让它把我想要的列联系起来?
是否尝试提取
[Key]
public int GroupId { get; set; }
public int ParentGroupId { get; set; }
到一个有自连接的Group表?这样你就可以有一个Part -> Group的导航属性。
组将包含部件及其父组的集合。
GroupId将是一个主键,您可以自引用ParentGroupId