【问题标题】:How can I create a custom m2m table in Entity Framework Code-First如何在实体框架代码优先中创建自定义 m2m 表
【发布时间】:2013-12-05 09:48:49
【问题描述】:

希望这是相对简单的,但我似乎无法全神贯注。

我有一个这样的 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 是只有一堆查找数据的表。它们是徽章要求的列表。我现在需要的是一张表格来跟踪一个人完成徽章的进度。所以我有一个根用户对象,它有一个像这样的对象属性:

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

我希望 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 个查找表要连接到用户(之间有一两个表跳)

【问题讨论】:

  • 我觉得不错?我看到的唯一潜在问题是您必须访问该表才能获取数据。您需要多快的数据?如果它是一个像在线游戏这样的实时应用程序,您可能希望在需要之前将给定用户的数据加载到某个局部变量中。

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


【解决方案1】:

几点建议:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    相关资源
    最近更新 更多