繁体   English   中英

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

[英]How can I create a custom m2m table in Entity Framework 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 ...
}

这把我带到了我无法弄清楚的地方: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; }
}

我希望Tiger Trail清单显示这种数据(伪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类的一部分,总共有四个“尾迹”,因此有4个查找表要加入用户(表跳之间或两个表跳之间)

几个指针:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM