Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 实体框架-如何实现标记(针对文章/页面)_Asp.net Mvc_Entity Framework_Navigation_Tags - Fatal编程技术网

Asp.net mvc 实体框架-如何实现标记(针对文章/页面)

Asp.net mvc 实体框架-如何实现标记(针对文章/页面),asp.net-mvc,entity-framework,navigation,tags,Asp.net Mvc,Entity Framework,Navigation,Tags,我正在写一个基于EF的网站,它将有许多文章(带有id、作者、日期、标题等属性),每个文章都是类别的成员(10个可能的类别,每个类别都带有id、标题、相关图标等) 每篇文章也可以有几个“标签”。就像适用于SO问题的问题标签一样 例如,物品ID 1具有: 标题:“2016年10个最受欢迎的婴儿名字”,作者:“Jo Bloggs”,日期:2017-02-01等 CategoryID:2(类别的外键,其中ID 2是“审查中的年份”类别) (这是我不清楚的部分)标签:“列表”、“前10名”、“育儿”、“

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

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

例如,物品ID 1具有:

  • 标题:“2016年10个最受欢迎的婴儿名字”,作者:“Jo Bloggs”,日期:2017-02-01等
  • CategoryID:2(类别的外键,其中ID 2是“审查中的年份”类别)
  • (这是我不清楚的部分)标签:“列表”、“前10名”、“育儿”、“2016”、“趋势”、“婴儿”、“姓名”
文章ID 2(“我今年发现了50个生活黑客”)

  • 有自己的标题、作者等,也是类别ID 2的FK
  • (这是我不清楚的部分)标签:“2016”、“列表”、“生活黑客”、“自我提升”
从上面可以看出,有9个“不同的”标签,其中
2016
列表
适用于这两篇文章,其他标签各出现一次

随着文章的大量出现,标签的数量也越来越多

这只是
文章
标签
之间的多对多关系的一个例子,还是有更自然/惯用的方法来表示EF

我想做的主要事情是:

  • 在文章页面上,显示应用于该文章的标记(如查看问题时应用于该问题的堆栈溢出标记)
  • 显示“标签云”或标签列表,其中包含已标记为该标签的文章数。e、 g.
    列表(2)
    趋势(1)
  • 在创建文章时,如果标签不存在,则可以创建一个新的标签(尽管如果这太困难,我可以提前创建标签)
我不需要:

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

  • 我应该如何对数据库中的标记进行建模(应该有
    标记
    表和
    文章标记
    表(
    ArticleID
    TagID
    )还是其他什么?)
  • 使用EF来高效地表示
    文章
    -
    标记
    关系,我需要建立什么模型
我的背景是数据库,所以我了解FKs和链接表等,但我在EF方面很挣扎


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

您可以添加两个表,Tag和TagRelation,Tag负责保存标记名,如#Test#AnotherTest,确保无法插入相同的标记名。 在TagRelation中,您应该保留TagId(标记表的Fk)和Guid(文章、页面的Fk,并由您命名)。 在这种体系结构中,每个需要标记的表在搜索ex-article时都必须有一个Guid类型的字段(SQL数据类型中的uniqueidentifier)。您只需在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
}

除非您完全是先编写代码,否则只需像平常一样创建数据库,然后使用数据库优先模式之一映射您构建的模式。否则,您所询问的就是所谓的“导航属性”,是的,您可以使用联接表。