检查StackOverflow OData service它就像Posts / PostTags / Tags ...我该如何复制呢?
所以我有一个名为BlogPost的简单类 - 没什么特别的。只是一篇博文。现在,我希望为这个类添加标记。与StackOverflow问题的标签完全相同 - 5个字符串,空格分隔。然后使用Entity Framework 4将此数据保存到我的Sql Server 2008数据库。
所以,起初我以为我可以添加ICollection<string> Tags { get; set; }
或StringCollection Tags { get; set; }
对于数据库,只需要一个名为Tags
的新表,它是BlogPost的外键和VarChar(100) Tag
字段。
但后来我想如果我这样做,我会在该数据库表中有很多重复的标签。可能有两张桌子。
标签都是唯一的实例。
现在很容易在数据库中建模,但我不知道如何在EF中进行此操作?这是一个很好的建模方法吗?那是在SO做什么的?
我真的很喜欢ICollection<string> Tags { get; set; }
(它很干净)但我不知道如何使用EF作为我的数据访问,在数据库中有唯一标记。
我只是不知道如何为博客帖子添加一些标签,并确保标签是唯一的,但仍然可以参考博客帖子。
比如,这应该是数据库的责任,所以当我尝试保存博客帖子时,那时我会通过检查它们是否先存在然后插入或更新唯一标签来单独处理标签。 。并在BlogPostsToTags表中使用此引用ID?竞争条件会发生什么?我是否需要为此使用事务......如果是这样的话......如果表被锁定,读取性能如何?
答案 0 :(得分:0)
听起来你走在正确的轨道上。在您的标记表中,您可能需要考虑使用正确的套接字和标准化(所有小写,无标点符号)版本的标记,以便您可以将相似的版本映射到同一标记(例如StackOverflow,stackoverflow,stack-overflow)。 / p>
它与您的博文之间的多对多关联将为您提供任何条目的标签集合。
您可以在C#中使用唯一性代码:使用Hashset<Tag>
和各种集合运算符来查找新标记。您可以使用异常处理逐个添加新标记,并为乐观并发异常添加适当的重试代码。获得数据库中的所有标记后,您可以将所需的任何新关联添加到博客文章中并保存这些更改。
当你想要将这些相同的标签应用于许多其他表时(如果它们都从一些公共基础实体表继承而在这种情况下很容易),它变得很难。