Guid ID对象的备用字符串ID

时间:2013-12-15 09:36:23

标签: sql-server asp.net-mvc entity-framework ef-code-first indexing

我目前在代码优先的实体框架Guid中使用ContentItem作为Context的主键。但是,由于Guid非常笨重,我还想根据以下逻辑为每个ContentItem(或ContentItem的后代)设置一个替代友好ID:

  1. 使用Name属性,降低,用-替换空格,并使用-结束前缀
  2. 在数据库中查看哪个ContentItem具有相同前缀的FriendlyID,并找到具有最高数字后缀的那个
  3. 将其增加1并添加为后缀
  4. 因此名为“Great Story”的第一个项目将FriendlyID great-story-1,下一个great-story-2,等等。

    我意识到有很多方法可以实现这类事情,但这是我的问题:

    1. 建议根据此逻辑使用备用ID显式设置新字段,还是应该每次应用与生成ID以查找正确对象相同的规则时运行查询?
    2. 我应该如何强制执行备用ID的设置?我应该在创建时为每个内容项的服务方法执行此操作吗? (这关系到我,因为如果有人忘记将该逻辑添加到服务方法,现在该对象没有FriendlyID)或者我应该在模型本身中使用具有手动定义的getters的属性/必须查询数据库并找出下一个可用FriendlyID是什么的setter?
    3. 是否有其他方法可以使用此类FriendlyID来制作人性化的网址和网络服务请求?这件事的最终目的是让我们可以让用户前往http://awesomewebsite.com/Content/great-story-1并发送到正确的内容项,而不是http://awesomewebsite.com/Content/f0be271e-ee01-48de-8599-ddd602e777b6等。

1 个答案:

答案 0 :(得分:1)

  1. 预先生成它们。这允许您索引它们。我理解你的担忧,但在实践中别无选择。 (我已经这样做了。)
  2. 我不知道您应用的架构。请注意,生成此类ID需要数据库查询访问权限。它可能不应该作为实体本身的属性或方法来完成。
  3. 您可以通过将“发言名称”以及ID放入网址来使用组合。我见过网站这样做。但是对于GUID ID来说,这并不完美。
  4. 为自己编写一些帮助方法,以方便而强大的方式生成此类字符串ID。这样做就好了。