【问题标题】:Entity Framework - how to implement Tags (for Articles / Pages)实体框架 - 如何实现标签(用于文章/页面)
【发布时间】:2017-02-08 19:36:20
【问题描述】:

我正在编写一个基于 EF 的网站,它将有许多 Articles(带有 id、作者、日期、标题等属性),每个都是 Category 的成员(10 个可能的类别,每个类别都有 id、标题, 相关图标等)

每篇文章也可以有多个“标签”。就像应用于 SO 问题的问题标签一样。

例如文章 ID 1 有:

  • 标题:“2016 年 10 个最受欢迎的婴儿名字”,作者:“Jo Bloggs”,日期:2017-02-01,等等
  • CategoryID:2(Category 表的外键,其中 ID 2 是“年度回顾”类别)
  • (这是我不清楚的部分) 标签:“列表”、“前 10 名”、“育儿”、“2016”、“趋势”、“婴儿”、“名字” "

文章 ID 2(“我今年发现的 50 个生活小窍门”)

  • 有自己的标题、作者等,也是类别 ID 2 的 FK
  • (这是我不清楚的部分) 标签:“2016”、“列表”、“生活小窍门”、“自我提升”

从上面有 9 个“不同”标签,其中 2016Lists 适用于两篇文章,其他标签各出现一次。

随着文章的数量越来越多,标签的数量也越来越多。

这只是ArticleTag 的多对多关系的情况,还是有一些更自然/惯用的方式来表示使用 EF?

我想做的主要事情是:

  • 在文章页面上,显示适用于该文章的标签(如查看问题时适用的 Stack Overflow 标签)。
  • 显示“标签云”或标签列表,其中包含已被标记的文章数量。例如Lists (2) , Trends (1)
  • 可能在创建文章时,如果标签尚不存在,则可以创建一个新标签来配合它(尽管如果这太难了,我可以预先创建标签)。李>

不需要

  • 查询文章以查找标签 = THIS 而不是 THAT 或任何类似逻辑的文章
  • 保留标签的顺序(我将在视图/控制器逻辑中对它们进行排序,因此它们的存储顺序无关紧要)

我需要知道的:

  • 我应该如何对数据库中的标签进行建模(应该有Tag 表和ArticleTag 表(ArticleIDTagID)还是其他?)
  • 我需要使用 EF 建模什么来有效地表示 article--tag 关系?

我的背景是数据库,所以我了解 FK 和链接表等,但在 EF 方面苦苦挣扎。

关于我的要求的注意事项:这是我为自己创建的网站,所以我已经知道要求。例如,我不会遇到“用户”要求能够保持标签顺序的情况。

【问题讨论】:

  • 除非您完全以代码为先,否则只需像往常一样创建数据库,然后使用其中一种数据库优先模式来映射您已构建的模式。否则,您要询问的内容称为“导航属性”,是的,您可以使用连接表。

标签: asp.net-mvc entity-framework navigation tags


【解决方案1】:

可以添加2个表,Tag和TagRelation,Tag负责保存#Test #AnotherTest等TagNames,确保没有办法插入相同的tagName。 在 TagRelation 中,您应该保留 TagId(标签表的 Fk)和 Guid(文章的 Fk,页面和您的名字)。 在这种架构中,每个需要 Tag 的表,在搜索 ex 时都必须有一个 Guid 类型(SQL 数据类型中的唯一标识符)的字段。文章您只需在 Guid 字段上使用 TagRelation 设置内部连接

public class Tag
{
    public long Id { get; set; }
    public string TagName { get; set; }
}

public class TagRelation
{
    public long Id { get; set; }
    public long TagId { get; set; }
    public Guid FkUniqueGuid { get; set; }

}

public class Article
{
    public long Id { get; set; }
    public Guid UniqueGuid { get; set; }
    //And another fields
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2011-09-07
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多