【问题标题】:Alternate string ID for Guid ID objectsGuid ID 对象的备用字符串 ID
【发布时间】:2013-12-15 09:36:22
【问题描述】:

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

  1. 使用 Name 属性来降低,用 - 替换空格,并用 - 结束前缀
  2. 在数据库中查找其他ContentItem 有相同前缀的FriendlyID,并找到具有最高数字后缀的那个
  3. 将其增加 1 并添加为后缀

所以名称为“Great Story”的第一个项目将有 FriendlyIDgreat-story-1,下一个是 great-story-2,依此类推。

我知道有很多方法可以实现这种事情,但这里有我的问题:

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

【问题讨论】:

  • 可以更改名称或删除或停用项目吗?如果是这样,您是否希望 FriendlyId 稳定?当用户返回一个 5 年前的链接时,预期的行为是什么?我的猜测是它应该被存储而不是动态生成。并且您需要保留以前使用的所有值,以免重复使用它们。
  • @HABO - 好点。你是对的 - 即使我对返回的结果进行了排序 CreatedDate,比如说,如果有任何一个被删除,它就会把整个计划扔掉。

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


【解决方案1】:
  1. 预先生成它们。这允许您对它们进行索引。我理解您的担忧,但在实践中别无选择。 (我已经这样做了。)
  2. 我不知道您的应用程序的架构。请注意,生成这样的 ID 需要数据库查询访问权限。它可能不应该作为实体本身的属性或方法来完成。
  3. 您可以通过在 URL 中同时输入“口语名称”和 ID 来使用组合。我见过网站这样做。不过,对于 GUID ID,这并不完全漂亮。

自己编写一些辅助方法,以方便且可靠的方式生成此类字符串 ID。这样就不会那么麻烦了。

【讨论】:

  • 谢谢,尤其是第 2 点。这是我主要关心的问题(关于尝试在模型本身中做到这一点)。
猜你喜欢
  • 2012-10-17
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2019-02-12
  • 1970-01-01
  • 2014-11-27
  • 2019-12-17
相关资源
最近更新 更多