实体框架4.1通过设置外键来映射关系

时间:2011-05-03 16:17:39

标签: c# entity-framework entity-framework-4.1 entity code-first

如何告诉血腥的实体框架将关系映射到想要的列!

我有一张桌子:

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

每个 部分都有多个ParentParts ...

生成的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 =&gt;上加入表格是错误的。 GroupId,当我尝试通过ParentGroupId =&gt;加入时的GroupId。

所以我试试这个:

            modelBuilder.Entity<Part>()
            .HasMany(s => s.ParentParts)
            .WithMany()
            .Map(m =>
                     {
                         m.ToTable("parts");
                         m.MapLeftKey("GroupId");
                         m.MapRightKey("ParentGroupId");
                     });

同样的事情......似乎实体框架只会映射到密钥列!如何让它与我想要的列相关联?

1 个答案:

答案 0 :(得分:0)

您是否尝试过提取

[Key]
public int GroupId { get; set; }        
public int ParentGroupId { get; set; } 

到具有自联接的组表? 这样你就可以有Part的导航属性 - &gt;基。

组将包含零件及其父组的集合。

GroupId将成为主键,您可以自行引用ParentGroupId