如何在Entity Framework Code-First中创建自定义m2m表

时间:2013-11-21 04:08:20

标签: c# sql entity-framework ef-code-first

希望这是相对简单的,但我似乎无法围绕这样做。

我有一个像这样的POCO:

public class TigerTrailRequiredBadge
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public virtual ICollection<TigerTrailRequiredBadgeSubRequirement> TigerTrailRequiredBadgeSubRequirements { get; set; }
}

和一个非常相似的人:

public class TigerTrailElectiveBadge
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public int Number { get; set; }
    public string Name { get; set; }
    public string Requirement { get; set; }
}

这两个poco是只有一堆查找数据的表。它们是徽章要求的清单。我现在需要的是一张表来跟踪一个人完成徽章的进度。所以我有一个root用户对象,它有一个像这样的对象属性:

public class Youth
{
    ...
    public virtual YouthCubRequirementsTracker YouthCubRequirementsTracker { get; set; }
    ...
}

poco看起来像这样:

public class YouthCubRequirementsTracker
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public bool TigerTrailDone { get; set; }
    public virtual TigerTrailChecklist TigerTrailChecklist { get; set; }
    ...more 'Trail' Checklists ...
}

带给我的poco我无法弄明白:TigerTrailChecklist:

public class TigerTrailChecklist
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public List<TigerTrailRequiredBadge> RequiredBadges { get; set; }
    public List<TigerTrailElectiveBadge> ElectiveBadges { get; set; }
}

我希望老虎踪迹清单显示这种数据(伪sql结果)

Id      FK_ReqBadgeId      FK_ElectiveBadgeID      Complete      CompleteDate
1       42                 null                    true          11-12-13
2       null               13                      true          11-12-14

所以,有几个问题:

  1. 对于我想要完成的事情,这是一个很好的方法吗?
  2. 如何通过代码首先完成我想要的结果?
  3. 当我沿着这条路走时,我会看到任何陷阱吗?这只是YouthRequirementTracker类的一部分,总共有四个'trail',所以有4个查找表可以连接到一个用户(有一个表跳或两个之间)

1 个答案:

答案 0 :(得分:0)

有几点指示:

  1. 您无需在{0}}和[Key]属性中注释您的POCO Id属性。实体框架将按惯例将Id列视为主键,并在运行时自动分配其值。
  2. 据我所知,您的POCO之间没有定义多对多的关系。 (我可能错了,但请指出它在哪里)。
  3. 考虑使您的类更通用或使用抽象 - 您不需要为所有四个路径重复代码,因为它会增加您必须维护的代码量。为什么不只有一个带有附加列的查找表用于路径名称(或者更好,为路径创建一个单独的表并只引用相应的条目)?